xaml中如何初始化数组类型的wpf 依赖属性 xaml

扫一扫体验手机阅读
XAML实例教程系列 - 依赖属性和附加属性
微软发布Visual Studio 2012 RC和Windows 8 Release Preview版本,从本篇开始,所有实例将基于最新版本开发工具VS2012 RC和Win 8 RP版。
下载Visual Studio 2012 RC :
下载Windows 8 Release Preview:
在 上几篇XAML实例教程中,分别介绍XAML对象,属性以及命名空间的概念。从这篇开始,将讨论常见的XAML高级话题,其中包括依赖属性 (Dependency Properties), 附加属性(Attached Properties), 事件处理(Event)等。这些话题是Windows 8和Silverlight实际项目中经常用到的开发知识,也是XAML开发语言的精华。
依赖属性(Dependency Properties)
依 赖属性,英文称为Dependency Properties,是Windows 8,Silverlight特有的属性系统。在传统.Net应用开发中,CLR属性是面向对象编程的基础,主要提供对私有字段的访问封装,开发人员可以使 用get和set访问器实现读写属性操作。在Windows 8应用开发中,依赖属性和CLR属性类似,同样提供一个实例级私有字段的访问封装,通过GetValue和SetValue访问器实现属性的读写操作。依赖属性最重要的一个特点是属性值依赖于一个或者多个数据源,提供这些数据源的方式也可以不同,例如,通过数据绑定提供数据源,通过动画,模板资源,样式等方式提供数据源等,在不同的方式数据源下,依赖属性可以实时对属性值进行改变。也正是因为依赖多数据源的缘故,所以称之为依赖属性。
依赖属性可以通过多种不同类型的数据源进行赋值,其赋值顺序的不同影响着属性值的改变。为了能够获取准确的依赖属性值,需要了解不同数据源的优先级别,如下图:
1. 从图中可以看到,应用动画占有对以来属性控制的最高优先级,简单理解,无论动画代码定义在当前页面内,还是定义在模板代码内,动画都将获得对页面内依赖属性的最优先控制权。
2. 次一级优先权是依赖属性本地化操作,分别包括其中包括依赖属性赋值,数据绑定,资源引用等。依赖属性使用方式和CLR属性使用类似,可以使用以下格式对依赖属性进行赋值操作:
元素对象.依赖属性 = 属性值
例如: 按钮控件中,宽度属性属于依赖属性(随后实例详解),其赋值方法是: Button.Width = 160;
3. 第三优先权是数据模板和控件模板对依赖属性的控制;
4. 其次是样式控制器对依赖属性的控制优先权;
5. 最低的依赖属性控制优先权是在定义依赖属性时使用GetValue和SetValue对属性默认的赋值。
开发人员可以通过对依赖属性不同优先权的控制,操作页面属性值,使控件或者页面达到需求运行效果。
下面实例帮助大家理解Windows 8依赖属性优先级的应用:
该实例仍旧使用前几篇中的XamlGuide项目演示,移植到Visual Studio 2012 RC平台,
定义一个简单用户控件样式 - ButtonStyle,在样式代码中,定义了按钮的内容文本颜色(Foreground)为&Black&黑色,另外定义字体尺寸(FontSize)为24pt, 同时定义按钮文本内容(Content)是&XAML依赖属性测试&:
如果应用以上资源样式到本地按钮控件,运行结果如下:
但 是,如果在&Grid&中定义一个按钮控件,在该按钮控件中,定义按钮文本内容(Content)为&XAML依赖属性测试&,定义按钮内容 文本颜色(Foreground)为&Yellow&黄色,按钮文本字体尺寸(FontSize)为14pt,按钮宽度(Width)为200,同时调用 静态资源样式ButtonStyle.
最终运行结果如下:
根据前文讲述的依赖属性执行优先级,按钮控件本地赋值优先于控件样式,所以以上代码中,忽略了ButtonStyle样式,应用本地依赖属性值生成不同结果。
XAML的附加属性(Attached Properties)
Attached Properties,中文称为附加属性,该属性是一种特殊的依赖属性,同时也是XAML中特有的属性之一。其语法调用格式如下:
&控件元素对象 附加元素对象.附加属性名 = 属性值 /&
我 们可以通过以下几个实例理解附加属性,例如,在布局控件Canvas中定义一个按钮控件,而按钮本身没有任何属性可以控制其在布局控件Canvas中的位 置,而在Canvas中,定义了两个依赖属性作为按钮控件的附加属性,帮助按钮控制在Canvas中的位置,其代码如下:
&&&&Button&Canvas.Left=&25&&Canvas.Top=&30&&/&
在&Button&控件中,使用了&Canvas.附加属性&,效果如同按钮控件从布局控件中继承了Left和Top两个属性值,这时尽管这两个属性仍旧属于Canvas控件,但是属性值已经附加到了按钮控件上,并产生了效果。
另外一个附加属性的实例是TooltipService工具提示服务控件,默认控件生成,不具备动态提示功能,而如果在控件中附加了TooltipService.ToolTip属性,就可以生成动态显示指定提示内容的效果。例如:
&Grid&x:Name=&LayoutRoot&&Background=&{StaticResource&ApplicationPageBackgroundThemeBrush}&&
&&&&&&&&&Button&Content=&XAML依赖属性测试&&Style=&{StaticResource&ButtonStyle}&
&&&&&&&&&&&&&&&&Foreground=&Yellow&&Width=&240&&FontSize=&14&&ToolTipService.ToolTip=&附加属性效果演示&/&
和布局控件的Left和Top道理相同,按钮控件中并没有ToolTip属性,只是附加或者可以理解为&继承&了ToolTipService类,生成以上效果。
从以上示例可以看出,附加属性主要目的是为了简化代码,增强XAML代码对元素对象的控制。通过对已知类属性的&继承&或者&附加&,在元素对象上实现特有的效果。
附加属性的应用还有许多例如动画故事板对目标属性的控制Storyboard.TargetProperty,Grid布局控件的行和列的控制(Row和Column)等。
今天暂时介绍到这里,欢迎留言讨论。
XAML实例教程系列:
欢迎大家留言交流,或者加入QQ群交流学习:
(一群) 超级群500人&
(二群) 超级群500人&
(三群) 高级群200人&
(四群) 超级群500人&
(五群) 高级群200人&
(六群) 超级群500人&
(八群) 超级群500人&
(九群 企业应用开发推荐群) 高级群200人&
(十群) 超级群500人&
(十一群 企业应用开发推荐群)超级群500人
<span type="1" blog_id="891122" userid='
243篇文章,154W+人气,2粉丝
高并发架构之路
¥51.00117人订阅
新西兰资深网工运维之道
¥51.00408人订阅
前百度高级工程师的架构高可用实战
¥51.00232人订阅
<span type="1" blog_id="891122" userid='WPF注册依赖属性—依赖属性值继承方法
1、假设定义了一个MyButton类,它继承自Button,给他增加一个Text的属性:
public class MyButton : Button
static MyButton()
FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
metadata.PropertyChangedCallback += SpacePropertyChangedC
metadata.DefaultValue = "Default Value";
metadata.Inherits = true;
SpaceProperty = DependencyProperty.Register(
"Space",typeof(string),
typeof(MyButton),
metadata);
public static readonly DependencyProperty SpaceP
public string Space
return (string)GetValue(SpaceProperty);
SetValue(SpaceProperty, value);
private static void SpacePropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
var obj = d as MyB
obj.Content = obj.S
2、在MainWIndow.xaml文件中应用该Button:
这里写代码片
x:Class="InheritDPDemo.SpaceWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:InheritDPDemo"
Title="SpaceWindow" Height="350" Width="525"&
Orientation="Vertical"&
x:Name="ButtonA"
Height="100" Click="ButtonA_Click"/&
x:Name="ButtonB" Height="100" Click="ButtonB_Click" /&
3、在SpaceWindow中定义一个依赖属性,并为两个button添加单击事件处理程序:
public partial class SpaceWindow : Window
public SpaceWindow()
InitializeComponent();
index1 = index2 = 0;
private int index1;
private int index2;
private void ButtonA_Click(object sender, RoutedEventArgs e)
ButtonA.Space = "ButtonA被点击了。了。。了。。。" + index1.ToString();
private void ButtonB_Click(object sender, RoutedEventArgs e)
Space = "ButtonB被点击了。了。。了。。。"+index2.ToString();
static SpaceWindow()
FrameworkPropertyMetadata md = new FrameworkPropertyMetadata("Hello", WinSpacePropertyChangedCallback);
md.Inherits = true;
SpaceProperty = MyButton.SpaceProperty.AddOwner(typeof(SpaceWindow));
SpaceProperty.OverrideMetadata(typeof(Window), md);
public static readonly DependencyProperty SpaceP
public string Space
return (string)GetValue(SpaceProperty);
SetValue(SpaceProperty, value);
private static void WinSpacePropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
var str = e.NewV
①在SpaceWindow中定义的依赖属性不是通过Register方法来生成的,而是用某个控件(MyButton)的属性的AddOwner方法来完成的:
SpaceProperty = MyButton.SpaceProperty.AddOwner(typeof(SpaceWindow))
实际上他还可以接受一个元数据的参数:
SpaceProperty = MyButton.SpaceProperty.AddOwner(typeof(SpaceWindow), new FrameworkPropertyMetadata("Hello", WinSpacePropertyChangedCallback));
也就是接受一个元数据参数,如果增加了这个元数据,就相当于调用了重载元数据OverrideMetadata函数:
FrameworkPropertyMetadata md = new FrameworkPropertyMetadata("TextB", WinSpacePropertyChangedCallback);
SpaceProperty = MyButton.SpaceProperty.AddOwner(typeof(SpaceWindow));
SpaceProperty.OverrideMetadata(typeof(Window), md);
重载元数据也就是新租车的依赖属性有着自己的元数据,如上面的元数据增加了自己的PropertyChangedCallback函数,当属性值被改变的时候就会调用自己回调函数,然后再调用他继承得到的回调函数,如果重载自己的回调函数,那么就只调用继承来的回调函数。
③(重点)
属性值继承的通俗理解就是我将我的(MyButton)Space属性增加一个拥有者(AddOwner方法)SpaceWindow。
**********************特别强调*******************
当MyButton中Space属性中值为默认值时,改变SpaceWindow中Space属性的值时,MyButton中Space属性的值也会改变;但是*,当MyButton中Space属性的值不是默认值时,改变SpaceWindow中Space属性的值就不会影响MyButton中Space属性的值了,这时候他们就分别存储了自己的有效属性值。*但是**当SpaceWindow中Space属性的值改变时,继承得到的PropertyChangedCallback函数依然会调用.
此外,如果MyButton中Space属性的值没有改变,修改了SpaceWindow中Space的值会两次调用MyButton中PropertyChangedCallback函数,因为一次是修改SpaceWindow中Space的值,一次是修改MyButton中Space的值。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!如何:为依赖项属性添加所有者类型 发布时间: 2016年6月
此示例演示如何将类添加为针对不同类型注册的依赖性属性的所有者。
通过执行此操作,WPF XAML 读取器和属性系统都可以将该类识别为属性的其他所有者。
添加所有者时,也可以选择添加类来提供类型特定的元数据。
在下面的示例中,StateProperty 是由 MyStateControl 类注册的属性。
类 UnrelatedStateControl 使用
AddOwner 方法将本身添加为 StateProperty 的所有者,当添加类型上存在依赖项属性时,则专门使用依赖项属性的新元数据允许的签名。
请注意,对于与
如何:实现依赖项属性示例中所示的示例类似的属性,应提供公共语言运行时 (CLR) 访问器,并在要添加为所有者的类上重新公开依赖项属性标识符。
未使用包装时,从使用
GetValue 或
SetValue 的程序访问的角度来看,依赖项属性仍将有效。
但是,您通常需要将此属性系统的行为与 CLR 属性包装并行处理。
包装使以编程方式对依赖项属性进行设置的操作更加容易,并可以将属性设置为 XAML 特性。
若要了解如何重写默认元数据,请参见
如何:重写依赖项属性的元数据。
public class MyStateControl : ButtonBase
public MyStateControl() : base() { }
public Boolean State
get { return (Boolean)this.GetValue(StateProperty); }
set { this.SetValue(StateProperty, value); }
public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
"State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false));
Public Class MyStateControl
Inherits ButtonBase
Public Sub New()
MyBase.New()
Public Property State() As Boolean
Return CType(Me.GetValue(StateProperty), Boolean)
Set(ByVal value As Boolean)
Me.SetValue(StateProperty, value)
End Property
Public Shared ReadOnly StateProperty As DependencyProperty = DependencyProperty.Register("State", GetType(Boolean), GetType(MyStateControl),New PropertyMetadata(False))
public class UnrelatedStateControl : Control
public UnrelatedStateControl() { }
public static readonly DependencyProperty StateProperty = MyStateControl.StateProperty.AddOwner(typeof(UnrelatedStateControl), new PropertyMetadata(true));
public Boolean State
get { return (Boolean)this.GetValue(StateProperty); }
set { this.SetValue(StateProperty, value); }
Public Class UnrelatedStateControl
Inherits Control
Public Sub New()
Public Shared ReadOnly StateProperty As DependencyProperty = MyStateControl.StateProperty.AddOwner(GetType(UnrelatedStateControl), New PropertyMetadata(True))
Public Property State() As Boolean
Return CType(Me.GetValue(StateProperty), Boolean)
Set(ByVal value As Boolean)
Me.SetValue(StateProperty, value)
End Property
自定义依赖项属性
依赖项属性概述
此页面有帮助吗?
您对此内容的反馈非常重要。请告诉我们您的想法。
更多反馈?
1500 个剩余字符
我们非常感谢您的反馈。
&#169; Microsoft 2018wpf自定义的依赖属性,只能后台使用,在xaml中使用报错,怎么回事?_百度知道
wpf自定义的依赖属性,只能后台使用,在xaml中使用报错,怎么回事?
wpf自定义的依赖属性,只能后台使用,在xaml中使用报错,怎么回事?我自定义的其他的自定义的属性,都是可以再xaml中设置,这次自定义的是BitmapImage类型的属性,使用时候,可以再后台使用,但是在xaml中使用就报错?为什么?
我有更好的答案
这里报错的原因都写出来了啊,你自己好好阅读下,不是说了设置属性出问题了吗?检查一下吧,一般这种错误问题不是很大,应该是概念混淆或者手误了
我也有点疑问,案例说应该没有问题的,不知道为什么报错, 写的其他的依赖属性,都没有报错的问题!
你可以直接去用Try和catch语句去检测一下啊,肯定有问题!
用try和catch找不到,我之前找过,有一点我不是很明白,如果,属性通过后台设置的话,就可以正常显示,但是如果xaml中设置属性的值,就会报错,这个是我一直不明白的?
有两种方式的啊……一种直接使用,一种是用元素的方式,你可以使用双向绑定的方法看看
采纳率:30%
留联系看。
为您推荐:
其他类似问题
xaml的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。依赖属性 DependencyProperty_博客园
当前位置: >
>依赖属性 DependencyProperty
依赖属性 DependencyProperty
& 作者:Andy Niu & 来源: 博客园-nzbbody &
解决的问题:一个控件可能有几百个CLR属性,如果每个CLR属性都是包装一个字段,那么这个控件耗费的内存太大了。依赖属性就是解决这个问题的。
如何解决这个问题:使控件的CLR属性不是包装字段,而是包装一个DependencyProperty,并且这个DependencyProperty的内存不是分配在控件内,而是采用某种机制分配在外部,以key-value的形式存在。另外,DependencyProperty还解决了一个问题,当DependencyProperty作为绑定源的时候,还能自动更新绑定目标的显示。
依赖属性的理解:
1、依赖属性就是可以自己没有值,通过binding 从数据源获得值的属性,也就是依赖在别人身上的属性。
2、只有依赖属性可以binding到别人身上,CLR属性不能binding到别人身上。
3、那为什么在XAML代码中会有如下的情况?
  &TextBox Name=&textBox2& Text=&{Binding ElementName=textBox1,Path=Text}&/&
&&& 就是把textBox2的CLR属性Text绑定到别人身上,这只是表面现象。实际上,上面的XAML等价的C#代码为:
&&&&this.textBox2.SetBinding(TextBox.TextProperty, new Binding(&Text&) { ElementName=&textBox1&});
&&&&SetBinding的方法定义为 :SetBinding(DependencyProperty dp, BindingBase binding);
4、有没有包装器,依赖属性都存在。那为什么还要使用CLR属性对依赖属性包装?
&&& 上面讨论的是依赖属性binding到别人身上,假如别人binding到依赖属性上,该怎么办呢?&CLR属性包装器的作用就是:以“实例属性”的形式向外界暴露依赖属性,这样依赖属性就能成为数据源的Path。需要特别注意的是,当数据源的Path为依赖属性,会自动通知Target更新显示。&
相关阅读:
来源:(微信/QQ:,微信公众号:makaidong-com) &&&&&& 欢迎分享本文,转载请保留出处!
&&&&&& 【原文阅读】:
上一篇:没有了
【相关文章】
每日最新文章
每日最热文章
本周最热文章
本月最热文章
本年最热文章
Powered by
Copyright &
www.makaidong.com, All Rights Reserved

我要回帖

更多关于 结构体数组初始化 的文章

 

随机推荐