【问题标题】:How to get events handlers for custom controls in Generic.Xaml [duplicate]如何在 Generic.Xaml 中获取自定义控件的事件处理程序 [重复]
【发布时间】:2014-05-12 13:37:12
【问题描述】:

我正在尝试创建一个带有两个按钮的自定义控件(例如)。我有一个看起来像这样的 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>

DoubleButton 类如下所示:

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

    public void leftButtonClick(object sender, RoutedEventArgs e)
    {
        MessageDialog dlg = new MessageDialog("message");
    }
}

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

谢谢

【问题讨论】:

  • 我在应用模板时通过 PART 执行此操作。我真的不知道这是否是批准的方式,但如果你有问题,你可以检查一下。
  • @GayotFow 感谢您提供信息。不管它是不是被批准的方式,它都有效。我在这个问题中记下了你的功劳。
  • 干得好!如果有任何用途,我可以添加一个答案,其中包括 PART 的属性定义和正确声明。我想我也可以将它添加到社区 wiki。
  • @GrayotFow 我在 Google 上找不到太多与 PART 相关的内容以及它的作用,因此我在没有它的情况下制定了解决方案。但是,如果这是重要的事情,那么我相信我,遇到这个问题的下一个人会很棒。
  • @XAMlMAX,我将把它添加到社区 wiki,我们可以看看它以后有多少浏览量 :)

标签: c# xaml windows-8 windows-runtime winrt-xaml


【解决方案1】:

如果一个给定的控件有一个事件处理程序,你可以这样设置...

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

【讨论】:

  • 我想知道,@Gayot,调用DefaultStyleKeyProperty.OverrideMetadata() 而不是直接设置this.DefaultStyleKey = typeof(...) 有什么具体原因吗?
  • 非常好!您需要选择继承的属性。要检查,请使用带有和不带有该覆盖的主题文件。
  • 好吧,我多年来一直在设置 DefaultStyleKey,因为这是您在模板化/自定义控件 VS 项目模板中得到的,并且没有发现问题,所以如果您能详细说明一下关于“拾取继承的属性”的意思-我真的很想学习!
  • 那我很可能误解了你的问题。我建议阅读此msdn.microsoft.com/en-us/library/…
  • 哦,我想我现在明白了 - 谢谢,那篇文章有点启发性。我现在也明白了,当我在考虑 WinRT/XAML 时,我正在以 WPF 的形式回答这个问题,因为 OP 提到了 Windows-8/Microsoft-Metro 标签,而在 WinRT/XAML 中,你没有得到 OverrideMetadata() 方法,而是只需设置属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2012-10-29
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 2012-11-22
  • 2011-04-17
相关资源
最近更新 更多