【问题标题】:How do I handle click events on multiple similar buttons in WPF?如何处理 WPF 中多个类似按钮的点击事件?
【发布时间】:2010-06-11 16:44:53
【问题描述】:

我是 C# 初学者,正在尝试在 WPF 中实现数字键盘。它由 10 个类似的按钮组成:

<Button Content="0" Name="button0" Click="anyButtonClicked" />
<Button Content="1" Name="button1" Click="anyButtonClicked" />
<Button Content="2" Name="button2" Click="anyButtonClicked" />
...
<Button Content="9" Name="button9" Click="anyButtonClicked" />

处理所有这些按钮的最佳做法是什么?我是在每个函数后面的代码中构建一个函数(这会很无聊而且我自己会重复),还是我构建一个函数来处理任何点击的按钮?

在第二种情况下,我如何识别单击了哪个按钮?我需要访问 sender 对象的哪些属性?

【问题讨论】:

    标签: c# wpf code-behind


    【解决方案1】:

    如果您想使用后面的代码,则可以将其连接到单个事件处理程序,然后可以将 sender 转换为 Button(或 FrameworkElement)并检查其 Name property

    在下面扩展地精的答案;如果您想坚持使用代码和事件,您可以在父面板上定义事件:

    <StackPanel Button.Click="anyButtonClicked">
        <Button Content="0" Name="button0"/>
        <Button Content="1" Name="button1"/>
        <Button Content="2" Name="button2"/>
        ...
        <Button Content="9" Name="button9"/>
    </StackPanel>
    

    然后使用 e.OriginalSource,转换为 Button 或 FrameworElement,检索名称。

    private void anyButtonClicked(object sender, RoutedEventArgs e)
    {
        var source = e.OriginalSource as FrameworkElement;
    
        if (source == null)
            return;
    
        MessageBox.Show(source.Name);
    }
    

    或者,您可以采用 MVVM 方法,将所有按钮都绑定到一个命令,然后传递一个 CommandParameter 来区分它们。

    【讨论】:

      【解决方案2】:

      您在父控件中处理 Button.Click 事件:

      <StackPanel Button.Click="anyButtonClicked">
          <Button Content="0" Name="button0"/>
          <Button Content="1" Name="button1"/>
          <Button Content="2" Name="button2"/>
          ...
          <Button Content="9" Name="button9"/>
      </StackPanel>
      

      然后在您的事件处理程序中 - 您可以检查 e.OriginalSource 是否有按下的按钮。

      编辑:至于你关于如何处理它的问题 - 你可以使用按下按钮的 Content-property 来找出关键,然后使用它来执行你的逻辑。

      【讨论】:

      • 谢谢。嗯,使用 content 属性是个好主意吗?我可以想象在多语言环境中内容会发生变化。 (不过,我还没有做到这一点。)
      • 呵呵 - 不,随着您的应用程序扩展 - 这可能不是一个好主意。我同意 Veer 和 Steven 在你走得更远的时候采取指挥方式。 “首先让它工作......”。
      【解决方案3】:

      您确实需要使用命令方法,因为您可能也需要它来进行按键操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-09
        • 1970-01-01
        • 2011-10-11
        • 2011-10-16
        相关资源
        最近更新 更多