WPF如何知道在多个按钮中当前按下的按钮

9

我有多个带有内容1、2、3、4、5等的按钮,所有按钮在点击事件上使用相同的函数。

<Button Content="1" Height="30" Name="button1" Width="30" Click="calculate"/>
<Button Content="2" Height="30" Name="button2" Width="30" Click="calculate"/>
<Button Content="3" Height="30" Name="button3" Width="30" Click="calculate"/>
<Button Content="4" Height="30" Name="button4" Width="30" Click="calculate"/>
<Button Content="5" Height="30" Name="button5" Width="30" Click="calculate"/>

我如何在calculate函数中知道哪个按钮被按下了?我想获取被按下的按钮的内容。

private void calculate(object sender, RoutedEventArgs e)
        {

        }

谢谢您。

4个回答

22

您可以在函数中使用以下代码获取内容属性 -

string content = (sender as Button).Content.ToString();

@RV:谢谢。但是它给我一个类型转换错误。我们需要使用(sender as Button).Content.ToString(); - KillerFish
是的,我忘记了那部分!!Content属性返回一个对象类型,所以你需要将其转换为字符串。 - Rohit Vats

5
如果在你的XAML中为按钮放置Namex:Name属性,那么你可以使用原生的object.Equals()而不必进行转换或取消引用。这也可以保护你免于在控件的Content更改时需要双重编辑代码,并可能忘记在两个位置都进行编辑。
给定:
<Button Name="btnOne" ... />
<Button Name="btnTwo" ... />

那么

if (sender.Equals(btnOne)) {...}
if (sender.Equals(btnTwo)) {...}

这假定在XAML中有xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml",并且XAML控件和事件处理程序属于同一类。 - ergohack

2

在大多数情况下使用属性x:Name是很好的选择

如果你在XAML中使用x:Name属性,会更好一些。

例如,如果你在XAML中使用x:Name属性,它将与你的源代码完美地结合起来。

<Button x:Name="BtnA" Content="Some Btn A" Click="TestBtn_Click"></Button>
<Button x:Name="BtnB" Content="Some Btn B" Click="TestBtn_Click"></Button>

然后,您可以通过类型BtnA和BtnB在.cs文件中获取此对象。

private void TestBtn_Click(object sender, RoutedEventArgs e) {
if(sender.Equals(BtnA)) {
    //User click BtnA to trigger TestBtn_Click()
} else if (sender.Equals(BtnB)) {
    //User click BtnB to trigger TestBtn_Click()
} else {
    //trigger TestBtn_Click() by another reason.
}    

通过x:Name属性,你的.cs文件可以通过它选择XAML中的任何元素。


1
我倾向于通过将一个对象附加到按钮的工具提示属性来解决这个问题。然后,您可以像这样获取它:
void EditMe(object sender, RoutedEventArgs e)
{
    Button x = sender as Button;
if (x != null) { int id = (x.ToolTip as TT).Id; } }
在此示例中,TT对象看起来像这样:
        public class TT
        {
            public int Id { get; set; }
            public string Text { get; set; }
            public override string ToString()
            {
                return Text;
            }
        }
这将在UI上显示工具提示文本并使ID在单击处理程序中可访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接