如何在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");
    }
}

但是这个方法永远不会被调用。如果有人知道如何为自定义控件引发事件,那就太好了。

谢谢

如何在Generic.Xaml中获得自定义控件的事件处理程序

如果给定的控件要有一个事件处理程序,您可以这样设置它…

            <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和其他表面设计师使用。这是一个非常有用的约定