依賴項屬性概述 wpf

這主要是主對依賴屬性的理解,大家還是多看看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 元素定義了許多非依賴項屬性的屬性。 一般說來,只有在需要支持至少一個由屬性系統啓用的方案(數據綁定、樣式、動畫、默認值支持、繼承、附加屬性或失效)時,纔將屬性實現爲依賴項屬性。

發佈了45 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章