WPF依赖属性-依赖属性介绍
时间:2021-06-28 21:03:52
收藏:0
阅读:0
WPF的设计理念是:数据驱动,UI与逻辑松耦合
一、传统的CLR属性
public class Person
{
private string _Name;
public string Name
{
get
{
return _Name;
}
set
{
_Name = value;
}
}
}
二、CLR属性特点:
- CLR属性,是实例属性;
- 在多级继承的情况下,孙孙辈对象占用内存空间不可避免的膨胀;
三、依赖属性
// 1. 使类型继承DependencyObject类
public class Person : DependencyObject
{
// 2. 声明一个静态只读的DependencyProperty 字段
public static readonly DependencyProperty nameProperty;
static Person()
{
// 3. 注册定义的依赖属性
nameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Person),
new PropertyMetadata("Learning Hard",OnValueChanged));
}
// 4. 属性包装器,通过它来读取和设置我们刚才注册的依赖属性
public string Name
{
get { return (string)GetValue(nameProperty); }
set { SetValue(nameProperty, value); }
}
private static void OnValueChanged(DependencyObject dpobj, DependencyPropertyChangedEventArgs e)
{
// 当只发生改变时回调的方法
}
}
四、依赖属性的特点
1、依赖属性声明为:类的静态只读对象;
2、依赖属性是通过DependencyObject注册的属性;
3、依赖属性读取是通过DependencyObject的方法读取;
4、类的依赖属性只有一份,且由DependecyObject维护。
5、多级继承,且大多数字段值不改变的情况下,减少内存占比
?DependencyProperty将一个对象依赖属性存储在一个全局的Hashtable中;通过依赖对象(DependencyObject)的GetValue和SetValue存取数据;
6、?依赖属性值可以通过Binding依赖于其它对象上,这就使得数据源一变动;依赖于此数据源的依赖属性全部进行更新
五、依赖属性特性应用
1、依赖属性(值传递)继承
中逻辑树上实际父级变动,在子级没有显式指定值时,默认采用父级的值
?如下图中:窗体上所有的字体都变大(从20变成了50),并不需要通过设置每个控件的属性;只需要设置窗体的属性,这个窗体的子控件就会适应这一改变,并且使用相同的设置
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="WPF Example" SizeToContent="WidthAndHeight"
FontSize="50" FontStyle="Italic"
Background="Blue">
<StackPanel>
<Label FontWeight="Bold" FontSize="20" Foreground="White">
Hi There!
</Label>
<Label>2015 Solidmango</Label>
<ListBox>
<ListBoxItem>Item1</ListBoxItem>
<ListBoxItem>Item2</ListBoxItem>
</ListBox>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button MinWidth="75" Margin="10">Help</Button>
<Button MinWidth="75" Margin="10">OK</Button>
</StackPanel>
<StatusBar>Solidmango</StatusBar>
</StackPanel>
</Window>
2、属性的改变通知
CLR属性只有通过事件响应函数或者回调函数来传递属性性改变; 依赖属性只需配置就可以(见第三部分的示例)
更详细的介绍参见依赖属性的传递
五、依赖属性的优先级
评论(0)