我想创建一个从ContentControl派生的新自定义控件(它将是窗口中其他控件的容器),但我想要一个按钮来关闭它。 (实际上我想要一个无边框窗口,但是使用类似系统的按钮来关闭它。)
所以我为控件创建了Style,其中包含一个包含两行的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 :(得分: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事件。这不是路由事件,因此您必须在父控件中手动连接它
Methinks你也可以使用MouseLeftButtonDown路由事件并检查按钮是否在父级别被点击 - 将自己去...