设为首页 收藏本站
查看: 1022|回复: 0

Windows phone 7之依赖属性(Dependency Properties)

[复制链接]

尚未签到

发表于 2015-5-9 11:29:53 | 显示全部楼层 |阅读模式
  依赖属性(Dependency Properties)
  如果你要创建一个自定义控件类,并为这个类定义新的属性,如果你想给这些属性设置Style,或者你想通过给那些属性设置数据绑定(Binding),或者想对这些属性使用动画,那么你需要将这些属性设置成依赖属性(Dependency Properties)。
  下面我们先看一个简单了例子,自定义一个类,继承自Button,也就是我们自己做一个Button,并为之定义两个属性Color1和Color2,代码如下



public class MyButton : Button
{
public MyButton()
{
}
private Color _forceColor;
public Color ForceColor
{
get
{
return _forceColor;
}
set
{
_forceColor = value;
this.Foreground = new SolidColorBrush() { Color = _forceColor};
}
}
private Color _backColor;
public Color BackColor
{
get
{
return _backColor;
}
set
{
_backColor = value;
this.Background = new SolidColorBrush() { Color = _backColor };
}
}
}
  上面定义一个Button,声明两个属性Color1和Color2,为Color1属性Set值时,同时将值赋给前景色Foreground,为Color2属性Set值时,同时将值赋给背景色Background,
在MainPage中添当前项目的加命名空间xmlns:local="clr-namespace:DependencyProperties"
  在页面中添加一个MyButton,直接枚举设置ForceColor和BackColor:
  
  添加资源
  Red
White
  再在页面中添加一个MyButton,设置ForceColor和BackColor值为上面定义的资源
  
  现在运行一下程序,效果如下
DSC0000.jpg
  上面是预料中的结果,现在我们用Style设置ForceColor和BackColor的值,定义资源
DSC0001.jpg
  上面是我定义资源时,代码编辑器中的效果,看到有错误提示,看看错误窗口
DSC0002.jpg
  未将对象引用设置到对象的实例,这事怎么回事呢,先不管他,
  在页面中添加一个MyButton,并使用上面定义的Style
  
  运行一下,看看
DSC0003.jpg
  调试也是通不过,为什么呢,这就是我之前说的,要想为自定义的属性使用Style,那么就必须将之设置为DependencyProperty
  DependencyProperty的定义格式为
  public static readonly DependencyProperty 变量名=
DependencyProperty.Register("属性名",
typeof(属性类型),
typeof(所属类的类型),
new PropertyMetadata(默认值, 值变化时触发的方法));
  现在我们修改之前的代码,将ForceColor和BackColor设置为DependencyProperty,修改后的MyButton类如下



public class MyButton : Button
{
public MyButton()
{
}
public static readonly DependencyProperty ForceColorProperty =
DependencyProperty.Register("ForceColor",
typeof(Color),
typeof(MyButton),
new PropertyMetadata(Colors.Black, OnColorChanged));
public static readonly DependencyProperty BackColorProperty =
DependencyProperty.Register("BackColor",
typeof(Color),
typeof(MyButton),
new PropertyMetadata(Colors.White, OnColorChanged));
public Color ForceColor
{
set { SetValue(ForceColorProperty, value); }
get { return (Color)GetValue(ForceColorProperty); }
}
public Color BackColor
{
set { SetValue(BackColorProperty, value); }
get { return (Color)GetValue(BackColorProperty); }
}
static void OnColorChanged(DependencyObject obj,
DependencyPropertyChangedEventArgs args)
{
var btn = obj as MyButton;
if (args.Property == ForceColorProperty)
{
btn.Foreground = new SolidColorBrush() { Color = (Color)args.NewValue };
}
if (args.Property == BackColorProperty)
{
btn.Background = new SolidColorBrush() { Color = (Color)args.NewValue };
}
}
}
  现在看看之前定义的Style
DSC0004.jpg
  已经不报错了,现在运行程序,效果如下
DSC0005.jpg
  现在我们知道DependencyProperty的重要性了吧
  
  再给初学者说明点问题,明白人绕过
  上面的例子中定义DependencyProperty是使用的是static和readonly,这就是我们不能直接用"="为其复制,而且是静态变量,而非实例变量。所有MyButton公用的属性,而且上面OnColorChanged也是static,全是静态的,那么我们猜想,在设置他们的值是,那不就是改变了所有MyButton的属性了吗,那可绝对不是我们想要的结果,那么们看一看,是不是事情是不是我们想的那样糟糕
  再次添加一个Style,并添加一个MyButton,使用次Style
  
            
            

  
  运行一下,看看效果
DSC0006.jpg
  这不是我们猜想的坏的结果,而是一个令人激动地,满意的结果,为什么会这样,关键就在OnColorChanged参数和方法体上,耐心点,再看看完整的OnColorChanged



static void OnColorChanged(DependencyObject obj,
DependencyPropertyChangedEventArgs args)
{
var btn = obj as MyButton;
if (args.Property == ForceColorProperty)
{
btn.Foreground = new SolidColorBrush() { Color = (Color)args.NewValue };
}
if (args.Property == BackColorProperty)
{
btn.Background = new SolidColorBrush() { Color = (Color)args.NewValue };
}
}
  我们看到,有两个参数,第一个参数就是当前,使用属性的实例对象MyButton,第二个参数是但前设置的值
我们将之获取,然和设置相应的属性,就可以了,这样虽然是静态变量,也不会不会影响到其他的实例。
  在看看Button的Foreground属性,官方定义的是public Brush Foreground { get; set; },所以他是一个实例属性,而非静态属性,所以你想用MyButton.Foreground是通不过的,如果你想讲自己顶一个属性用到基础属性上,根本不会出错。
  如果你本来就没有上面的错误猜测,就当我说了一个笑话吧
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-65204-1-1.html 上篇帖子: [译]实现Windows Phone 7 下的DataTemplateSelector 和 CustomDataTemplateSelector 下篇帖子: 发现WPF在Windows 7 的一个BUG ,多点触摸开发的注意了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表