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

Ral*_*alt 2 c# xaml windows-8 windows-runtime winrt-xaml

我试图用两个按钮创建一个自定义控件(例如)。我有一个Generic.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>
Run Code Online (Sandbox Code Playgroud)

DoubleButton类如下所示:

public sealed class DoubleButton : Control
{
    public DoubleButton()
    {
        this.DefaultStyleKey = typeof(DoubleButton);
    }

    public void leftButtonClick(object sender, RoutedEventArgs e)
    {
        MessageDialog dlg = new MessageDialog("message");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这种方法永远不会被调用。如果有人对如何为自定义控件引发事件有个好主意。

谢谢

Gay*_*Fow 6

如果给定的控件具有事件处理程序,则可以像这样设置它...

            <Grid>
                <Button x:Name="PART_leftButton"  />
                <Button x:Name="PART_rightButton" />
            </Grid>
Run Code Online (Sandbox Code Playgroud)

名称的第一部分以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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...当应用控件模板时,将添加事件处理程序。注意类定义中的属性“ TemplatePartAttribute”。

保留此属性不会使您的程序崩溃或进行任何其他操作。这是专业的礼节,适合那些以后可能会阅读您的代码的人。并且由Blend其他曲面设计师使用。这是一个非常有用的约定。