1. 程式人生 > >wpf自定義控制元件之依賴屬性

wpf自定義控制元件之依賴屬性

 

在wpf開發過程中,總會用到格式各樣的控制元件,但是原生控制元件遠遠不能滿足實際開發的需要,這時候wpf強大之處就能體現出來了。根據實際需求自定義各種不同的控制元件滿足不同的業務需求。

首先說需求吧:

一:根據某個bool值,控制一個圓形控制元件顯示或者不顯示某種顏色。

分析:

一:需求就一句話,但是根據這一句話,就能得到一些必要的資訊。

  1.控制元件繫結的值是個Bool型。

  2.圓形控制元件。

  3.根據傳進來的bool值做邏輯處理。

分析完需求之後就要開始思考怎麼實現了,仔細想想,其實wpf中的Ellipse控制元件可以畫出帶顏色的圓形,問題就在於如何根據繫結的值顯示某種顏色。

如果對程式碼要求不高,沒什麼複用性要求的話,可以直接寫在xaml對應的.cs檔案中,按照bool值來給控制元件賦值顏色,但是如果對這個圓形複用性很高,或者程式碼分離,不允許在.cs檔案中寫程式碼,那就只能想其他辦法了。

囉嗦到現在,實現這個控制元件有三個方式:1.寫在xaml對應的.cs中。2.寫一個convert類來轉換。3.自定義一個圓形控制元件。

本文著重說一下自定義圓形控制元件,另外兩種方式不贅述。

實現:

一.新建wpf引用程式,名為LedTest,新建一個名為LED的使用者控制元件,用來寫自定義的控制元件,專案結構為下圖:

二.在使用者控制元件中的介面上先畫好帶顏色的圓形:

三.重頭戲來了,接下來就是依賴屬性了。

首先,什麼是依賴屬性?為什麼要用依賴屬性?

完整的依賴屬性解釋百度上有,我就說一下我的理解:依賴屬性是wpf提供的一種為豐富控制元件屬性,使依賴屬性可以依賴於控制元件繫結的值,並可以對這些值進行一些邏輯處理的東西。

瞭解了什麼是依賴屬性後就知道了為什麼要用依賴屬性,因為依賴屬效能夠拓展控制元件的屬性,譬如給button增加一個新的屬性,使button繫結值的時候能達到某種效果。

廢話不說了,直接上程式碼:

 

 

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;

namespace LedTest
{
/// <summary>
/// LED.xaml 的互動邏輯
/// </summary>
public partial class LED : UserControl
{
/// <summary>
/// 建構函式
/// </summary>
public LED()
{
InitializeComponent();
}
/// <summary>
/// 定義屬性
/// </summary>
public int Colors
{
get { return (int)GetValue(ColorsProperty); }
set { SetValue(ColorsProperty, value); }
}

// Using a DependencyProperty as the backing store for Colors. This enables animation, styling, binding, etc...
/// <summary>
/// 依賴屬性註冊
/// 引數1:Colors,標定了控制元件中的屬性名
/// 引數2:typeof(int),確定了引數1的值型別
/// 引數3:typeof(LED),指定了引數作用的域/介面
/// 引數4:new UIPropertyMetadata(1, ChangeColor),1是指定了引數1的預設值(預設值的設定根據需要自己確定),
/// ChangeColor為回撥函式,根據介面繫結的值執行某些邏輯處理
/// </summary>
public static readonly DependencyProperty ColorsProperty =
DependencyProperty.Register("Colors", typeof(int), typeof(LED), new UIPropertyMetadata(1, ChangeColor));

/// <summary>
/// 回撥函式,根據繫結的值做邏輯處理
/// </summary>
/// <param name="obj"></param>
/// <param name="r"></param>
private static void ChangeColor(DependencyObject obj, DependencyPropertyChangedEventArgs r)
{
LED led = (LED)obj;
Ellipse ellipse = led.LedControl;
if (r.NewValue.Equals(0))
{
ellipse.Fill = new SolidColorBrush(System.Windows.Media.Colors.Gray);
}
}


}
}

至此,這個圓形的控制元件就算封裝好了,接下來就算在介面上使用了。

四.主介面使用自定義的控制元件

控制元件封裝好,用就簡單了,下面就是用法。

 

 五.到這裡呢,自定義控制元件、依賴屬性註冊就結束了。本例子非常非常的基礎,僅僅適合不瞭解wpf自定義控制元件的夥伴屬性程式碼用。需用自取,無用不噴。謝謝