WPF中的两个基本属性:Dependency属性即依赖项属性,Attached属性即附加属性。
1.Dependency属性。
这个属性是基于其他输入值通过计算而获得的。可以通过属性是否存在依赖项信息来判断是否是依赖属性。
依赖项信息包括一个指向该依赖项属性的DependencyProperty 标识符字段的链接,
还包括一个为该属性设置的元数据选项的列表、每个类的重写信息以及其他详细信息.
依赖项属性的设置有下面几个方面:
(1)依赖项属性值可以通过引用资源来设置
<DockPanel.Resources>
<SolidColorBrush x:Key="MyBrush" Color="Gold"/>
</DockPanel.Resources>
<Button Background="{DynamicResource MyBrush}" Content="I am gold" />
(2)依赖项属性可以通过数据绑定来引用值
<Button Content="{Binding ElementName=label1,Path=Content}" />
(3)样式和模板是使用依赖项属性的两个主要应用
<Style x:Key="GreenButtonStyle">
<Setter Property="Control.Background" Value="Green"/>
</Style>
<Button Style="{StaticResource GreenButtonStyle}">I am green!</Button>
(4)可以对依赖项属性进行动画处理
<Button>I am animated
<Button.Background>
<SolidColorBrush x:Name="AnimBrush"/>
</Button.Background>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Loaded">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetName="AnimBrush"
Storyboard.TargetProperty="(SolidColorBrush.Color)"
From="Red" To="Green" Duration="0:0:5"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
(5)元数据重写,可以通过重写依赖项属性的元数据来更改该属性的某些行为
public class SpinnerControl : ItemsControl
{
static SpinnerControl()
{
DefaultStyleKeyProperty.OverrideMetadata(
typeof(SpinnerControl),
new FrameworkPropertyMetadata(typeof(SpinnerControl))
);
}
}
(6)属性值继承,元素可以从其在对象树中的父级继承依赖项属性的值。
<StackPanel Canvas.Top="50" DataContext="{Binding Source={StaticResource XmlTeamsSource}}">
<Button Content="{Binding XPath=Team/@TeamName}"/>
</StackPanel>
(7)如果自定义控件具有实现为依赖项属性的属性,则它将收到相应的 适用于 Visual Studio 的 WPF 设计器支持。
2.Attached属性
附加属性是一种没有常规属性包装的特殊依赖项属性。 附加属性旨在用作可在任何对象上设置的一类全局属性。
(1)XAML的附加属性
<DockPanel>
<CheckBox DockPanel.Dock="Top">Hello</CheckBox>
</DockPanel>
(2)代码中的附加属性
DockPanel myDockPanel = new DockPanel();
CheckBox myCheckBox = new CheckBox();
myCheckBox.Content = "Hello";
myDockPanel.Children.Add(myCheckBox);
DockPanel.SetDock(myCheckBox, Dock.Top);
(2)自定义附加属性
public static readonly DependencyProperty OldTextProperty = DependencyProperty.RegisterAttached(
"OldText",
typeof(String),
typeof(TextBox),
new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)
);
public static void SetOldText(UIElement element, String value)
{
element.SetValue(OldTextProperty, value);
}
public static String GetOldText(UIElement element)
{
return (String)element.GetValue(OldTextProperty);
}