在wpf開發過程中,總會用到格式各樣的控件,但是原生控件遠遠不能滿足實際開發的需要,這時候wpf強大之處就能體現出來了。根據實際需求自定義各種不同的控件滿足不同的業務需求。
首先說需求吧:
一:根據某個綁定的int值,控制一個圓形控件顯示或者不顯示某種顏色。
分析:
一:需求就一句話,但是根據這一句話,就能得到一些必要的信息。
1.控件綁定的值是個int型。
2.圓形控件。
3.根據傳進來的int值做邏輯處理。
分析完需求之后就要開始思考怎么實現了,仔細想想,其實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自定義控件的伙伴屬性代碼用。需用自取,無用不噴。謝謝