【问题标题】:wpf custom control eventswpf 自定义控件事件
【发布时间】:2012-05-21 23:25:45
【问题描述】:

我想创建一个包含 Button 和 ContentPresenter 的自定义 wpf 控件。由于 WPF 控件应该是无外观的,因此我创建了一个应该包含控件行为的类,并将控件的默认样式放在 generic.xaml 文件中。到目前为止一切顺利。

但是如何让我的按钮引发一个事件(路由事件?)并在我的控件类中处理它?我发现我可以从 generic.xaml 为 ResourceDictionary 添加代码隐藏文件并将我的事件处理程序放在那里,但这会将我的控件的行为与其模板相关联,因此是不可取的。我见过的另一个想法(但还没有尝试过)是使用 TemplatePart 机制来定位模板内的一些关键控件并订阅代码中的事件。但这对我来说似乎不够灵活,因为我的控件的用户可能希望将按钮替换为我在设计控件时不知道任何事件的控件。

那么当单击按钮并在我的控件的代码文件中订阅它时,如何在 XAML 中引发事件?

【问题讨论】:

    标签: c# .net wpf wpf-controls custom-controls


    【解决方案1】:

    覆盖控件的OnApplyTemplate 方法。

    这是您知道模板已被应用的地方,您可以使用 GetTemplateChild 获取对控件的引用。

    例如:

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        var myButton = this.GetTemplateChild("myButton") as Button;
        if(myButton != null)
        {
            myButton.Click += ...;
    }
    

    【讨论】:

    • 此方法假定我知道控件模板有一个名为“myButton”的“Button”并且我想订阅“Click”事件。我不想做出这样的假设。用户应该能够将其更改为引发“MouseEnter”事件的名为“myLabel”的“Label”。
    • 在这种情况下,请确保模板触发命令并处理实现 Execute 方法。使用混合行为,您可以让任何事件执行命令。
    • 我尝试阅读命令,但在这种情况下我仍然不知道如何使用它们。我需要创建自己的实现 ICommand 接口的对象还是可以重用通用命令?如何在 XAML 中引用它?我已经看到一些示例声称该命令必须是静态类中的公共静态属性 - 那么如何将应该对其执行操作的对象的实例传递给命令?我需要使用 CommandTarget 吗?
    • 我终于找到了一篇描述如何解决我的问题的文章:keyvan.io/how-to-add-commands-to-custom-wpf-control 虽然您的回答并不完全符合我的预期,但它在一定程度上帮助了我,因此添加了 +1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2020-10-08
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多