一、依赖属性
1.依赖属性是什么
依赖属性是一种自己可以没有值,但是可以通过绑定数据源获取值的属性;它可以支持样式设置、数据绑定、结合绑定一起实时数据更新UI显示、动画、自定义控件等。
2.依赖属性与普通属性区别
依赖属性对普通属性进行了包装,使得我们可以用和以前一样的方式来使用依赖属性。
在WinForm的UI控件类包含很多属性,实际上每次只是使用一部分属性,但是每个控件的属性都会赋予初始值,这白白消耗内存资源。
WPF的依赖属性内部使用哈希表存储机制,对多个相同控件的相同属性的值都只保存一份,从而节约资源。
3.依赖属性的优先级
WPF允许在多个地方设置依赖属性的值,这样就涉及到依赖属性获取值的优先级问题。
依赖属性设置的优先级按从高到低排序依次为:
属性系统强制转换、动画、本地值、模板属性、隐式样式、样式触发器、模板触发器、样式、继承和默认值。
二、依赖属性的使用
1.依赖属性对样式的支持
通过样式的方式设置Button的Background背景颜色为OldLace。
代码如下(示例):
App.xaml
<Application.Resources>
<Style x:Key="ButtonStyle">
<Setter Property="Control.Background" Value="OldLace"></Setter>
</Style>
</Application.Resources>
MainWindow.xaml
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Name="btn1" Style="{StaticResource ButtonStyle}">依赖属性对样式的支持</Button>
</StackPanel>
</Grid>
效果图:

2.依赖属性对资源引用的支持
通过对资源引用的方式设置Button的Background数值为Orange。
代码如下(示例):
APP.xaml
<Application.Resources>
<SolidColorBrush x:Key="BtnBrush" Color="Orange"/>
</Application.Resources>
MainWindow.xaml
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Name="btn2" Background="{DynamicResource BtnBrush}">依赖属性对资源引用的支持</Button>
</StackPanel>
</Grid>
3.依赖属性对动画的支持
代码如下(示例):
MainWindow.xaml
<Grid >
<Button Height="30" Width="200">鼠标移动到上面,前景色变为红色
<Button.Style>
<Style TargetType="Button">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Foreground" Value="Red"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</Grid>
效果图:

4.依赖属性对属性值继承的支持
先保留Window窗体默认的字体大小,第一按钮将窗台的FontSize改为18;
第二个按钮将该控件本身FontSize改为15;
第三个按钮复原窗体的FontSize。
代码如下(示例):
MainWindows.xaml
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Button Grid.Row="0" Name="btn1" Height="50" Width="150" Click="Btn_SetFontSize">Set the window font</Button>
<Button Grid.Row="1" Name="btn2" Height="50" Width="150" Click="Btn_SetButtonFont">Set the button font</Button>
<Button Grid.Row="2" Name="btn3" Height="50" Width="150" Click="Btn_ResetFontSize">Reset the font</Button>
</Grid>
MainWindows.xaml.cs
public partial class MainWindow : Window
{
private double fontSize = 0;
public MainWindow()
{
InitializeComponent();
fontSize = this.FontSize;
}
private void Btn_SetFontSize(object sender, RoutedEventArgs e)
{
this.FontSize =18 ;
}
private void Btn_SetButtonFont(object sender, RoutedEventArgs e)
{
this.btn2.FontSize = 15;
}
private void Btn_ResetFontSize(object sender, RoutedEventArgs e)
{
this.FontSize = fontSize;
this.btn3.FontSize = fontSize;
}
}
5.依赖属性对数据绑定的支持
下面例子展示如何绑定 TextBlock 的值以匹配 TextBox 的 Text 属性:
在WrapPanel面板中,第二TextBlock控件的绑定路径Binding Path为改控件的Text属性,绑定源控件是Name为txtValue的TextBox控件;
当你在 TextBox 中输入文本时,TextBlock 也会跟随TextBox的Text属性内容自动更新。
代码如下(示例):
MainWindows.xaml
<StackPanel Margin="10">
<TextBox Name="txtValue" />
<WrapPanel Margin="0,10">
<TextBlock Text="Value: " FontWeight="Bold" />
<TextBlock Text="{Binding Path=Text, ElementName=txtValue}" />
</WrapPanel>
</StackPanel>
效果图:
