【问题标题】:Custom Controls: Add custom button click logic within a custom control自定义控件:在自定义控件中添加自定义按钮点击逻辑
【发布时间】:2020-09-25 11:43:17
【问题描述】:

我正在创建一个屏幕键盘自定义控件,它将文本发送到目标TextBox。在这个键盘内部,我布置了自定义 KeyboardKey 按钮控件,这些控件具有关联的文本输出或键盘按键(退格键、箭头键等)。

目前,我已经定义了一堆不同的控件,并在控件模板中硬编码了它们的Click 功能:

public override void OnApplyTemplate()
{
    base.OnApplyTemplate();
    Click += (s, e) =>
    {
        keyboard.Target.Focus(); // Focus on parent keyboard's TextBox
        /* Key press logic, e.g. send character output or execute key press */
    };
}

但我想知道我是否不能以更有条理的方式来做这件事。我观看了this tutorial about routed events 与自定义ICommands 一起工作,但不幸的是我无法使其在自定义控件中工作。 (直到mm8 最终指出了一种方法)

【问题讨论】:

  • 这是否意味着您有多个从 Button 派生的类?什么原因?
  • 您可以使用附加属性。类似于孩子告诉Grid 他们占据了哪个Row 和Column,你可以告诉你的键盘应该如何表现。
  • @Clemens 是的,我目前派生了一个OutputKey(字符输出)、LeftKey(导航)、RightKey(导航)和BackSpaceKey,但它们管理起来很烦人如果需要,请更新。
  • @Sinatr 理想情况下,我会创建一种从Button 派生的KeyboardKey 并给他们自定义命令,但我不确定如何。您能否指出一个在自定义控件中使用附加属性的示例?

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


【解决方案1】:

您可以创建一个自定义类并将dependency properties 添加到其中。像这样的:

public class CustomButton : Button
{
    public static readonly DependencyProperty SomeCommandProperty = 
        DependencyProperty.Register(nameof(SomeCommand), typeof(ICommand), typeof(CustomButton));

    public ICommand SomeCommand
    {
        get { return (ICommand)GetValue(SomeCommandProperty); }
        set { SetValue(SomeCommandProperty, value); }
    }

    protected override void OnClick()
    {
        base.OnClick();
        //do something based on the property value...
        if (SomeCommand != null)
            SomeCommand.Execute(null);
    }
}

然后,您可以在使用控件的任何地方设置依赖属性,例如:

<local:CustomButton Command="{Binding SomeCommand}" />

【讨论】:

  • 哦,对不起,我才看到你的回答!我想我可以在单独的文件中定义源自ICommand 的命令,对吧?
  • 您可以将SomeCommand 属性设置为实现ICommand 的任何对象,包括您自己的自定义命令。不过,我不确定这与您的原始问题有何关系。
  • 好吧,我打算为我拥有的两种类型的按钮写一个SendCharacterCommand 和KeyPressCommand。我只是不知道可以如此轻松地将它们链接起来!
  • 嗯,这两个命令需要不同的参数,这就是为什么我认为使用两个按钮会很好。
  • 是的,这是真的,我将更明确地提到ICommand 的使用。我看到了一个关于它们的教程,但是当我第一次尝试它们时它们似乎不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多