2012-07-04 83 views
3

我想創建一個從ContentControl派生的新自定義控件(它將成爲窗口中其他控件的容器),但我想要一個按鈕來關閉它。 (實際上我想要一個無邊框窗口,但是用系統按鈕關閉它)。Button.Click在自定義控件

所以我創建了包含兩行的Grid的控件的樣式,上面一行有一個帶有單個按鈕的StackPanel。

如何將按鈕的Click事件綁定到控件本身,引發事件,甚至將Close命令發送到父窗口?

<Grid> 
<Grid.RowDefinitions> 
    <RowDefinition Height="20" /> 
    <RowDefinition /> 
</Grid.RowDefinitions> 
<Border Background="Azure" Grid.Row="0"> 
    <StackPanel Orientation="Horizontal"> 
     <Button HorizontalAlignment="Right" Content="X" Click="Close_Click" /> 
    </StackPanel> 
    </Border> 
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="1"/> 
</Grid> 

而後面的代碼:

static STContentControl() 
{ 
DefaultStyleKeyProperty.OverrideMetadata(typeof(STContentControl), new FrameworkPropertyMetadata(typeof(STContentControl))); 
} 

public void Close_Click(object sender, RoutedEventArgs ea) 
{ 

} 
+0

不知道你在這裏想要什麼 - 你已經在控件上創建了一個點擊事件,當我點擊按鈕時我會觸發它,你在說什麼父窗口,你是什麼意思綁定點擊自己?你爲什麼要將點擊綁定到自己 - 你已經有一個點擊處理程序?你能解釋一下控件的佈局以及當你點擊按鈕時你期望發生什麼嗎? – Charleh

+0

我想要一個內容控件,它包含一個關閉包含這個控件的窗口的按鈕。所以代碼部分是我寫的控件的一部分。當我嘗試構建它時,出現一個錯誤,說我不能使用Click事件,或者我必須在包含我的控件的默認模板的ResourceDictionary標題中使用x:Class屬性。在我把它放在標題中後,它說在教室裏找不到Close_Click。 –

回答

2

這聽起來像你所創建的模板作爲一種資源,所以它被應用在運行時的控制。

您需要確保將OnApplyTemplate方法中的按鈕的點擊事件連接到您的控件上。

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.onapplytemplate.aspx

所以,你會忽略這對你的UC就像這樣:

class NewUC : UserControl 
{ 
    public event EventHandler CloseClicked; 

    public override void OnApplyTemplate() 
    { 
     Button btn = this.FindName("SomeButton") as Button; 

     if (btn == null) throw new Exception("Couldn't find 'Button'"); 

     btn.Click += new System.Windows.RoutedEventHandler(btn_Click); 
    } 

    void btn_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 
     OnCloseClicked(); 
    } 

    private void OnCloseClicked() 
    { 
     if (CloseClicked != null) 
      CloseClicked(this, EventArgs.Empty); 
    } 
}  

我添加了一個CloseClicked事件而你可以在你的父窗口處理的例子。這不是一個路由事件,所以你將不得不手動將它連接到父控制

你也可以使用MouseLeftButtonDown路由事件並檢查按鈕是否在父級別點擊 - 將有一個去我自己...

+0

謝謝,它的工作:) –

+1

哇,你快速工作:D – Charleh

+0

當我知道,該怎麼做,我就像雷聲:) –