如何在Generic.Xaml中获得自定义控件的事件处理程序
本文关键字:自定义控件 事件处理 程序 Generic Xaml | 更新日期: 2023-09-27 18:02:59
我正在尝试创建一个带有两个按钮的自定义控件(例如)。我有一个通用的。Xaml文件,看起来像这样
<Style TargetType="local:DoubleButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:DoubleButton">
<Grid>
<Button x:Name="leftButton" Click="leftButtonClick" />
<Button x:Name="rightButton" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
和DoubleButton类看起来像这样:
public sealed class DoubleButton : Control
{
public DoubleButton()
{
this.DefaultStyleKey = typeof(DoubleButton);
}
public void leftButtonClick(object sender, RoutedEventArgs e)
{
MessageDialog dlg = new MessageDialog("message");
}
}
但是这个方法永远不会被调用。如果有人知道如何为自定义控件引发事件,那就太好了。
谢谢
如果给定的控件要有一个事件处理程序,您可以这样设置它…
<Grid>
<Button x:Name="PART_leftButton" />
<Button x:Name="PART_rightButton" />
</Grid>
名称的第一部分以PART_
开头控件的后台代码如下所示…
[TemplatePart(Name = "PART_leftButton", Type = typeof(Button))]
public class CustomControl1 : Control
{
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
var button = Template.FindName("PART_leftButton", this) as Button;
if (button != null)
{
button.Click += (s, a) => Console.WriteLine(@"click");
}
}
}
…事件处理程序在应用控件模板时添加。注意类定义中的属性"TemplatePartAttribute
"。
省略此属性不会使程序崩溃或做任何不同的事情。这是对那些稍后可能阅读您代码的人的一种专业礼貌。它被Blend
和其他表面设计师使用。这是一个非常有用的约定