首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF 學習筆記:相依屬性 — 核心特性、變更通知、值繼承與優先序

     編輯:關於.NET

相依屬性本質:非語言層級屬性,而是 WPF 功能系統

相依屬性在 CLR 屬性基礎上封裝內建行為,賦予聲明式 XAML 強大的動態控制能力,遠勝傳統程式碼撰寫事件處理。

四大核心特性

  1. 稀疏儲存:未設定本地值時,同類型物件共享預設值,大幅節省記憶體
  2. 變更通知:值變更時透過中繼資料觸發聯動行為(繫結、動畫、樣式觸發)
  3. 屬性值繼承:可從視覺樹父層繼承值(如 FontSize、Foreground)
  4. 多提供者優先序:依優先順序從多來源決定最終值

相依屬性實作標準模式

public class MyClass : DependencyObject
{
    public static readonly DependencyProperty TestProperty;

    static MyClass()
    {
        TestProperty = DependencyProperty.Register(
            "Test", typeof(string), typeof(MyClass),
            new PropertyMetadata("Hello, World!", OnTestChanged));
    }

    private static void OnTestChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        // 值變更回呼
    }

    public string Test
    {
        get { return (string)GetValue(TestProperty); }
        set { SetValue(TestProperty, value); }
    }
}

提示: VS 中輸入 propdp + Tab 可快速產生程式碼片段。

變更通知與觸發器

相依屬性值變更自動推播至繫結目標:

<TextBox x:Name="textBox1" />
<Label Content="{Binding ElementName=textBox1, Path=Text}" />

修改 TextBox 文字,Label 即時同步,**無需撰寫任何程式碼**。

屬性觸發器:聲明式行為控制

<Button x:Name="btnTest">
 <Button.Style>
  <Style TargetType="{x:Type Button}">
   <Style.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
     <Setter Property="Foreground" Value="Red" />
    </Trigger>
   </Style.Triggers>
  </Style>
 </Button.Style>
</Button>

滑鼠移入按鈕時,前景色自動變紅。WPF 另提供資料觸發器、事件觸發器。

屬性值繼承

父元素設定可自動傳遞給所有後代元素(未明確設定者):

<Window FontSize="20">
 <Grid>
  <TextBox />
  <Label Content="Hello" />
  <Button Content="Test" />
 </Grid>
</Window>

所有子元素字體大小皆為 20。若子元素明確設定 FontSize="10",繼承鏈中斷。

注意: 非所有相依屬性支援繼承(需註冊時指定 FrameworkPropertyMetadataOptions.Inherits)。

多提供者優先序:基礎值判斷

同一相依屬性可在多處設定,WPF 依固定優先序決定最終值:

<Button Background="Red">
 <Button.Style>
  <Style TargetType="{x:Type Button}">
   <Setter Property="Background" Value="Green"/>
   <Style.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
     <Setter Property="Background" Value="Blue" />
    </Trigger>
   </Style.Triggers>
  </Style>
 </Button.Style>
</Button>

結果:紅色生效(本地值最高優先序)

優先序(高→低)來源
1本地值
2樣式觸發器
3樣板觸發器
4樣式設定器
5主題樣式觸發器
6主題樣式設定器
7屬性值繼承
8預設值

基礎值判斷後的進階處理管線

基礎值判斷 → 運算式計算 → 應用動畫 → 強制限制 → 驗證 → 最終結果
  1. 驗證:ValidateValueCallback 決定值是否合法
  2. 強制限制:CoerceValueCallback 限制值範圍(如 9~100)
  3. 動畫:優先序高於基礎值
  4. 運算式計算:如繫結運算式 (Binding) 需計算結果

清除本地值

this.button1.ClearValue(Button.BackgroundProperty);

附加屬性:父元素向子元素擴充設定

附加屬性是特殊相依屬性,定義於父類別,使用於子元素:

<DockPanel>
 <CheckBox DockPanel.Dock="Top">Hello</CheckBox>
</DockPanel>
<StackPanel TextElement.FontSize="30" TextElement.FontStyle="Bold">
 <Button>Help</Button>
 <Button>OK</Button>
</StackPanel>

DockPanel.Dock、TextElement.FontSize 皆非子元素原有屬性,透過附加屬性機制實現佈局與樣式擴充。本質上屬 XAML 概念,常用於佈局系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved