0%

WPF之依赖属性

依赖属性简述

  • 依赖属性的特性:依赖属性 = 普通属性+扩充特性

继承特性,父元素的依赖属性可被子元素所继承DataContext、FontSize、Background在父元素设置依赖属性时,如果子元素没有设置与其相同的依赖属性,子元素就会继承父元素依赖属性的值,例如

1
2
3
4
5
6
7
8
<Window Title="MainWindow" Height="300" Width="300" FontSize="24">
<StackPanel>
<TextBlock Text="字号改变" Margin="5" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<TextBlock Text="字号改变" Margin="5" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<TextBlock Text="字号改变" Margin="5" TextWrapping="Wrap" HorizontalAlignment="Center"/>
<Button Padding="5" Content="按下改变字号" Margin="5" Click="Button_Click" HorizontalAlignment="Center"/>
</StackPanel>
</Window>

由于Window设置了依赖属性FontSize,而其子元素都没有设置,所以由于继承性TextBlock和
Button会继承Window的FontSize属性的值。

值的自动验证和动态调整

属性变动通知

自定义依赖属性

注册依赖项属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//要定义依赖属性时,必须定义一个静态的只读的DependencyProperty的字段,该字段其实就是Register的返回值,MyValueProperty其实就是依赖项属性
static保持其属性信息始终可用,并且共享这些信息,readonly保持属性不可修改
public static readonly DependencyProperty MyValueProperty = DependencyProperty.Register(
"MyValue", //依赖属性名
typeof(int), //数据类型
typeof(DependencyPropertyClass), //依赖属性的宿主类型
new PropertyMetadata
(100, //默认值
//属性值改变时的回调方法,d为依赖属性,e为属性改变时触发的事件
(d, e) =>
{
MessageBox.Show("调用PropertyChangedCallback委托:Property:"
+ e.Property + ",OldValue:" + e.OldValue + ",NewValue:" + e.NewValue);
},
//用于动态调整值得回调方法,value为依赖属性的值
(d, value) =>
{
int newValue = (int)value + 1;
MessageBox.Show("调用CoerceValueCallback委托,原值:" + value + "新值:" + newValue);
return newValue;
}
));

添加属性包装器

1
2
3
4
5
public int MyValue
{
get { return (int)GetValue(MyValueProperty); }//依赖属性获取值的方式GetValue
set { SetValue(MyValueProperty, value); }//依赖属性设置值的方式SetValue
}
  • 包装器的作用是让依赖属性能用.Net属性使用的方式使用

在主程序使用用户控件的依赖属性

1
2
3
4
5
6
7
8
<Window xmlns:local="clr-namespace:DependencyPropertyDemo"
Title="MainWindow" Height="300" Width="300" FontSize="24">
<StackPanel>
<local:MyDPUserControl x:Name="myDP"/>
<Label Content="{Binding ElementName=myDP, Path=MyValue}" HorizontalAlignment="Center"/>
<Button Click="Button_Click_1" HorizontalAlignment="Center" Height="40" Content="按下改变MyValue的值"/>
</StackPanel>
</Window>

3)依赖属性应用于数据绑定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Window.Resources>
<local:MyWPFClass x:Key="MyWPFClassObject"/>
</Window.Resources>
<StackPanel Margin="10"
HorizontalAlignment="Center" DataContext="{StaticResource MyWPFClassObject}">
<TextBlock Text="滚动条和文本标签都直接绑定到一个MyWPFClass对象的MyValue属性实现同步"/>
<ScrollBar Maximum="100" Minimum="0" Width="300"
Background="DeepPink"
Orientation="Horizontal"
Margin="10" Value="{Binding MyValue}" LargeChange="10" SmallChange="1" HorizontalAlignment="Center"/>
<TextBlock Margin="10">
<Run>MyWPFClassObject.MyValue=</Run>
<Run FontSize="20" Foreground="Red" Text="{Binding Path=MyValue}"/>
</TextBlock>
</StackPanel>

依赖属性的自动调整特性

  • 两个回调函数:
  1. PropertyChangedCallback:当值改变时,此函数被调用
  2. CoerceValueCallback:用于调整输入值

参考文献:WPF编程宝典

-------------本文结束感谢您的阅读-------------