1. 程式人生 > >WPF: 只讀依賴屬性的介紹與實踐

WPF: 只讀依賴屬性的介紹與實踐

val 包括 結合 通過 觸發 clas 就是 post 能夠

在設計與開發 WPF 自定義控件時,我們常常為會控件添加一些依賴屬性以便於綁定或動畫等。事實上,除了能夠添加正常的依賴屬性外,我們還可以為控件添加只讀依賴屬性(以下統稱“只讀屬性”),以增加控件的靈活性。

這聽起來有些矛盾。只讀依賴屬性,只能讀不能寫,卻又怎麽能提高控件的靈活性呢?想想我們常用的 IsMouseOver 等屬性就可以理解,它們都是只讀屬性,但如果沒有它們,想要控制樣式將會很困難。

所以,總結來說,只讀屬性的特點是:無法賦值,不能綁定,不能用於動畫,不能驗證等;而之所以使用它,主要目的是結合屬性觸發器 (Trigger) 來實現樣式的切換

實踐

比如,我們要創建一個 FilePicker 控件,用戶通過它可以選擇文件。那麽,它至少包括一個 TextBlock(或 TextBox)和一個 Button,分別用於顯示選擇文件的路徑和打開對話框。

現在我們想實現當用戶選擇了文件後,控件呈現某種樣式。要這麽做,我們就可以增加一個 IsFilePicked 只讀屬性,然後在 ControlTemplate 中添加 Trigger 來控制樣式的變化。

1. 創建(定義與註冊)

創建只讀屬性與創建普通依賴屬性一樣,包括定義、註冊、與 CLR 屬性包裝這三步。不同的是要使用 DependencyProperty 的 RegisterReadOnly 方法來註冊,這個方法會返回 DependencyPropertyKey 對象,它包含了對應只讀屬性的標識符,也就是與它關聯的只讀屬性,並且對只讀屬性賦值也是通過它(註意:只讀屬性自身無法被賦值),代碼如下:

        // 只讀屬性的定義與註冊
        private static DependencyPropertyKey IsFilePickedPropertyKey = DependencyProperty.RegisterReadOnly("IsFilePicked", typeof(bool), typeof(FilePicker), new PropertyMetadata(false));

        public static DependencyProperty IsFilePickedProperty = IsFilePickedPropertyKey.DependencyProperty;

註意其中的命名,因為我們要創建的屬性是 IsFilePicked,所以上面兩個變量都是在這個名稱後加了後輟,分別是 PropertyKey 和 Property,這是命名規範。

2. 包裝

然後,將它以 CLR 屬性的方式來包裝,由於這是個只讀屬性,所以只需要 get 段就可以,代碼如下:

        // 只讀屬性的包裝
        public bool IsFilePicked
        {
            get { return (bool)GetValue(IsFilePickedProperty); }
        }

3. 通過 DependencyPropertyKey 賦值

在合適的位置(當用戶選擇過文件後),使用 SetValue 方法來賦值,SetValue 有兩個重載,要為只讀屬性賦值,需使用第二個 SetValue(DependencyPropertyKey key, object value) ,代碼如下:

     SetValue(IsFilePickedPropertyKey, true);

4. 應用

邏輯寫好後,在模板中增加以下 XAML 代碼,即可:

    <ControlTemplate.Triggers>
        <Trigger Property="IsFilePicked" Value="True">
            <!--顯示綠色邊框-->
            <Setter Property="BorderBrush" Value="Green" />
            <Setter Property="BorderThickness" Value="2" />
        </Trigger>
    </ControlTemplate.Triggers>

總結

本文簡單介紹了在 WPF 中如何創建以及使用只讀依賴屬性,合適地使用它,能夠使我們更靈活地實現對自定義控件樣式的控制。

WPF: 只讀依賴屬性的介紹與實踐