WPF属性

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);
}

你可能感兴趣的:(WPF)