2008年11月4日 星期二

什麼是Dependency Property

WPF 隨手筆記

中文譯為依存屬性, 是WPF 引進的新屬性.

為何需要Dependency Property?

先看看一般.NET 物件, 一般Windows 控制項的屬性皆為Instance Property, 以Button為例, 若Button有96個Property, 那麼建立一個Button物件, 就得佔用96Property 所需的空間, 當然Window Forms 2.0的Control屬性或許沒有那麼多, 也就不會考慮佔用太多記憶體空間的問題.

但是WPF 的控制項可以提供相當高彈性的畫面設計, 相對的所需的屬性就會很多, 可又未必每個屬性都會用的到, 若全部設計成Instance 的Property, 那WPF 應用程式的記憶體最低需求將會很可觀.

於是WPF 引進Dependency Property 的觀念, 將一些Property 從控制項的Instance Property(也就是傳統作法)抽離 改為Dependency Property.

那到底什麼是Dependency Property?

Dependency Property 是一個存在System.Windows.DependencyObject所延伸的類別的靜態屬性, 那些不絕對需要用的屬性在需要用時就將它放置在這個DependencyObject之中, 以提升記憶體的可用性.

在使用WPF Controls 你可以不用太在意屬性是Dependency Property或Instance Property, 因為它的用法就像一般Property 的使用方式一樣, 那些記憶體配置的細節都被包裝在類別之中了.

Dependency Property 帶來的好處

除了節省記憶體空間之外, 因為處理成Dependency Property, 在屬性值變更時它提供了變更告知的功能.

Dependency Property 沒有改變設定屬性的程式寫法, 確意外的改變了傳統事件的寫法, 例如, 傳統上若要判知滑鼠進入控制項範圍之內, 會在MouseEnter事件上進行處理.

// 當滑鼠移到按鈕上時將前景顏色改為藍色
void Button_MouseEnter(object sender, MouseEventArgs e)
{
Button b = sender as Button;
if (b != null) b.Foreground = Brushes.Blue;
}
// 當滑鼠移出按鈕時將前景顏色改回黑色
void Button_MouseLeave(object sender, MouseEventArgs e)
{
Button b = sender as Button;
if (b != null) b.Foreground = Brushes.Black;
}





有了Dependency Property 若要得知滑鼠進入控制項範圍除了原本的MouseEnter事件之外, 另可從IsMouseOver(依存)屬性得知, 也就是說, 連帶的若要在移入時變更背景色, 除了寫傳統事件程式外, 還有另一個更簡單的選擇, 那就是使用XAML的Trigger 觀念.






<Button Margin="186.6,148,277.4,216" x:Name="button">  
<Button.Style>
<Style TargetType="{x:Type Button}" >
<Style.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
        <Setter Property="Foreground" Value="Blue" />
    </Trigger>
</Style.Triggers>
</Style>
</Button.Style>
OK
</Button>



你不用擔心這段Trigger 元素沒有描述滑鼠移出時改回原來的色彩, 因為它會很聰明的自動改回去.







參考"Windows Presentation Foundation 新一代使用體驗開發實務"

(此書譯自原文:Windows Presentation Foundation UIeashed) 一書的第三章

3 則留言:

  1. Anita ,谢谢你写的这篇文章,我目前在研究(喜欢用这个词:) )WF, WF 里面也有DP 这个概念,只是一直比较模糊,你的这篇文章shed light on me

    有空加我msn 吧: xhinker@hotmail.com
    email:v-anzhu at microsoft.com
    我叫 Andrew

    回覆刪除
  2. 謝謝您,這篇文章真的能讓我看得懂,感謝…

    回覆刪除