依赖项属性概述 wpf

来源:互联网 发布:港式车仔面图片淘宝 编辑:程序博客网 时间:2024/05/18 01:22

这主要是主对依赖属性的理解,大家还是多看看msdn上面说的吧
https://msdn.microsoft.com/zh-cn/library/ms752914(v=vs.100).aspx
由 WPF 属性系统支持的属性称为依赖项属性。依赖项属性:一个由 DependencyProperty 支持的属性。
一个 DependencyProperty 实例,在注册依赖项属性时作为返回值获得,之后将存储为一个类静态成员。 对于与 WPF 属性系统交互的许多 APIs,此标识符用作一个参数。
CLR“包装”:属性的实际 get 和 set 实现。 这些实现通过在 GetValue 和 SetValue 调用中使用依赖项属性标识符来合并此标识符,从而使用 WPF 属性系统为属性提供支持。
属性以及支持它的 DependencyProperty 字段的命名约定非常重要。 字段总是与属性同名,但其后面追加了 Property 后缀。
可以在代码或 XAML 中设置属性
作为非特性语法的示例,下面的 XAML 示例显示了另一种按钮背景。 这一次不是设置简单的纯色,而是将背景设置为图像,用一个元素表示该图像并将该图像的源指定为嵌套元素的特性。 这是属性元素语法的示例。

<Button Content="Button!">  <Button.Background>    <ImageBrush ImageSource="wavy.jpg"/>  </Button.Background></Button>

在代码中设置属性
在代码中设置依赖项属性值通常只是调用由 CLR“包装”公开的 set 实现。Button myButton = new Button();
myButton.Width = 200.0;

获取属性值实质上也是在调用 get“包装”实现:

double whatWidth;whatWidth = myButton.Width;

您还可以直接调用属性系统 APIs GetValue 和 SetValue。 如果您使用的是现有属性,则上述操作通常不是必需的(使用包装会更方便,并能够更好地向开发人员工具公开属性)。但是在某些情况下适合直接调用 APIs。
依赖项属性提供用来扩展属性功能的功能,这与字段支持的属性相反。 每个这样的功能通常都表示或支持整套 WPF 功能中的特定功能:
资源
依赖项属性值可以通过引用资源来设置。 资源通常指定为页面根元素或应用程序的 Resources 属性值(通过这些位置可以非常方便地访问资源)。 下面的示例演示如何定义 SolidColorBrush 资源。

<DockPanel.Resources>  <SolidColorBrush x:Key="MyBrush" Color="Gold"/></DockPanel.Resources>

在定义了某个资源之后,可以引用该资源并使用它来提供属性值:

<Button Background="{DynamicResource MyBrush}" Content="I am gold" />

这个特定资源称为 DynamicResource 标记扩展(在 WPF XAML 中,可以使用静态或动态资源引用)。 若要使用动态资源引用,必须设置为依赖项属性,因此它是由 WPF 属性系统明确启用的动态资源引用用法。
资源被视为本地值,这意味着,如果您设置另一个本地值,该资源引用将被消除。
依赖项属性或 DependencyObject 类本身并不支持 INotifyPropertyChanged,以便为数据绑定操作生成有关 DependencyObject 源属性值变化的通知。
样式和模板是使用依赖项属性的两个主要激发方案。 在设置定义应用程序user interface (UI) 的属性时,样式尤其有用。 在 XAML 中,通常将样式定义为资源。 样式与属性系统交互,因为它们通常包含特定属性的“setter”,以及基于另一个属性的实时值更改属性值的“trigger”。
下面的示例创建一个非常简单的样式(该样式将在 Resources 字典中定义,未显示出来),然后将该样式直接应用于 Button 的 Style 属性。 样式中的 setter 将带样式的 Button 的 Background 属性设置为 green。

<Style x:Key="GreenButtonStyle"> <Setter Property="Control.Background" Value="Green"/> </Style><Button Style="{StaticResource GreenButtonStyle}">I am green!</Button>

动画
可以对依赖项属性进行动画处理。 在应用和运行动画时,经过动画处理的值的操作优先级将高于该属性以其他方式具有的任何值(如本地值)。

<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>

元数据重写
在从最初注册依赖项属性的类派生时,可以通过重写依赖项属性的元数据来更改该属性的某些行为。 对元数据的重写依赖于 DependencyProperty 标识符。 重写元数据不需要重新实现属性。 元数据的变化是由属性系统在本机处理的;对于所有从基类继承的属性,每个类都有可能基于每个类型保留元数据。
下面的示例重写依赖项属性 DefaultStyleKey 的元数据。 重写这个特定的依赖项属性的元数据是某个实现模式的一部分,该模式创建可以使用主题中的默认样式的控件。

public class SpinnerControl : ItemsControl{    static SpinnerControl()    {        DefaultStyleKeyProperty.OverrideMetadata(            typeof(SpinnerControl),             new FrameworkPropertyMetadata(typeof(SpinnerControl))        );    }}

属性值继承
元素可以从其在对象树中的父级继承依赖项属性的值。
属性值继承行为并未针对所有的依赖项属性在全局启用,因为继承的计算时间确实会对性能产生一定的影响。 属性值继承通常只有在特定方案指出适合使用属性值继承时才对属性启用。
下面的示例演示一个绑定,并设置指定绑定(在前面的绑定示例中未显示出来)的源的 DataContext 属性。 子对象中的任何后续绑定都不需要指定资源,而是可以使用从父 StackPanel 对象中的 DataContext 继承的值。 (此外,子对象可以选择直接定义其自身的 DataContext 或 Binding 中的 Source,也可以选择对其绑定的数据上下文故意不使用继承值。)<StackPanel Canvas.Top="50" DataContext="{Binding Source={StaticResource XmlTeamsSource}}">
<Button Content="{Binding XPath=Team/@TeamName}"/>
</StackPanel>

果自定义控件具有实现为依赖项属性的属性,则它将收到相应的 适用于 Visual Studio 的 WPF 设计器支持。 一个示例就是能够在“属性”窗口中编辑直接依赖项属性和附加依赖项属性
当您获取依赖项属性的值时,可能会获得通过其他参与 WPF 属性系统且基于属性的任一输入而在该属性上设置的值。 由于存在依赖项属性值优先级,使得属性获取值的方式的各种方案得以按可预测的方式交互。
请看下面的示例。 该示例包括一个应用于所有按钮及其 Background 属性的样式,但是之后还指定了一个具有在本地设置的 Background 值的按钮。
SDK 文档在讨论依赖项属性时有时会使用“本地值”或“本地设置的值”等术语。 本地设置的值是指在代码中直接为对象实例设置的属性 (Property) 值,或者在 XAML 中设置为元素属性 (Attribute) 的属性 (Property) 值。
原则上,对于第一个按钮,该属性会设置两次,但是仅应用了一个值,即具有最高优先级的值。 本地设置的值具有最高优先级(对于正在运行的动画除外,但是在本示例中没有应用动画),因此,对于第一个按钮的背景将使用本地设置的值,而不使用样式 setter 值。 第二个按钮没有本地值(而且没有其他比样式 setter 优先级更高的值),因此该按钮中的背景将来自样式 setter。

<StackPanel>  <StackPanel.Resources>    <Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">     <Setter Property="Background" Value="Red"/>    </Style>  </StackPanel.Resources>  <Button Background="Green">I am NOT red!</Button>  <Button>I am styled red</Button></StackPanel>

常,您不会希望总是应用样式,而且不希望样式遮盖单个元素的哪怕一个本地设置值(否则,通常将很难使用样式或元素)。 因此,来自样式的值的操作优先级将低于本地设置的值。 有关依赖项属性以及它的有效值可能来自何处的更完整列表,
在 WPF 元素定义了许多非依赖项属性的属性。 一般说来,只有在需要支持至少一个由属性系统启用的方案(数据绑定、样式、动画、默认值支持、继承、附加属性或失效)时,才将属性实现为依赖项属性。

0 0
原创粉丝点击