2009年8月31日 星期一

在WPF中新增自訂控制項

要做自訂的控制項很簡單
比較重要的是希望做到什麼程度的自訂
在wpf裡面基本上有四類
繼承類別說明
現有元件僅須做簡單改動即可,但自訂空間較小
UserControl可輕易的做出複合控制項,自訂空間自由,推薦
Control自訂空間更大,但須自行定義的東西較多,適合想用ControlTemplate自訂控制項的外觀或製作支援不同的主題的控制項的使用者
FrameworkElement完全不以現有元件為基礎,適合想要精準控制外觀或屬性的使用者

第一種方法是最簡單的,如果你只是想要有多一個屬性的button或是想要先訂好一些預設的事件處理函式(event handler)的話,那就直接繼承該選項,然後複寫你想要改變的屬性或新建屬性進去就可以了

public class NewButton1 : Button
{
/// constructor to set default event handler
public NewButton1()
{
Click += new RoutedEventHandler(Click);
}

/// default event handler of click, switch color
void Click(object sender, RoutedEventArgs e)
{
Button b = sender as Button;

if (b.Background == Brushes.Red)
{
b.Background = Brushes.Green;
}
else
{
b.Background = Brushes.Red;
}
}
}

不過這個用法只適用於不需要做太多複雜變更的單一控制項
如果希望能夠有更多的自訂空間的話,那就繼承UserControl

public class NewButton2 : UserControl
{
/// constructor to set default event handler
public NewButton2()
{
Button b = new Button();
b.Click += new RoutedEventHandler(Click);
this.Content = b;
}

/// default event handler of click, switch color
void Click(object sender, RoutedEventArgs e)
{
Button b = sender as Button;

if (b.Background == Brushes.Red)
{
b.Background = Brushes.Green;
}
else
{
b.Background = Brushes.Red;
}
}
}

上面兩個NewButton基本上是相同的
不過繼承自UserControl的NewButton2只要把Content改成一個Grid裡面就可以很容易的再增加一些其他原有的元件,對於需要使用複合元件的使用者來說會更方便一點

同時,繼承自UserControl的方式,多了一種新增的方法
可以在方案總管(Solution Explorer)的專案上面按右鍵
直接選擇新增使用者控制項(User Control)

這樣還會同時新增出一個xaml檔案
可以將一些屬性的設定直接寫在xaml檔案裡面

<UserControl x:Class="test_wpf.NewButton2"
...
>
<Button Click="Click" />
</UserControl>

一般狀況下使用上面的方法是最方便也最容易的
剩下的兩種狀況更適合有明確自訂需求
或是希望完全自訂而非製作複合控制項的進階使用者
可以直接參考msdn上面的詳細說明

另外,如果希望在XAML裡面宣告自訂的元件的話
可以參考在WPF的XAML裡面使用自訂的控制項

--
參考資料
控制項撰寫概觀
WPF Gadget Container Control
自訂 Windows Presentation Foundation 控制項
試試看:建立自訂的 WPF 控制項

沒有留言:

張貼留言