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自定義控制元件的夥伴屬性程式碼用。需用自取,無用不噴。謝謝