代码之家  ›  专栏  ›  技术社区  ›  Christian Studer delphist

如何处理WPF中多个类似按钮上的单击事件?

  •  2
  • Christian Studer delphist  · 技术社区  · 14 年前

    我是一个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" />
    

    处理所有这些按钮的最佳实践是什么?我是在代码中为每一个构建一个函数(这将是最无聊和重复我自己),还是构建一个函数来处理任何点击的按钮?

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

    3 回复  |  直到 14 年前
        1
  •  5
  •   Steven Robbins    14 年前

    如果您想使用代码隐藏,那么可以将其挂接到单个事件处理程序,然后可以将发送者强制转换为按钮(或FrameworkElement),并检查其 Name property .

    展开下面的Goblin答案;如果您想坚持代码隐藏和事件,可以在父面板上定义事件:

    <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,cast作为按钮或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
  •  1
  •   Goblin    14 年前

    处理按钮。单击父控件中的事件:

    <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>
    

    然后在EventHandler中,您可以检查e.OriginalSource中是否有按钮被按下。

    编辑:关于如何处理它的问题,您可以使用按钮的内容属性来确定键,然后使用它来执行逻辑。

        3
  •  1
  •   Amsakanna    14 年前

    您真的需要使用命令方法,因为您可能还需要它来进行按键操作。