是否可以给一个按钮关联信息?
Is it possible to give a button associated information?
抱歉,如果这个问题在 C# 术语中没有多大意义。我一直在用 Obj-C 编程,在那里,你可以给一个按钮 "tag".
我问是因为我以编程方式创建了很多按钮并让它们共享相同的 MouseDoubleClick 方法。问题是,如果没有 "tag",我无法辨别哪个按钮按下了它。希望这是有道理的?
如果您在 xaml 中定义一个按钮,如下所示:
<Button x:Name="nameOfButtonToIdentify"/>
x:Name
标签定义控件的名称。
如果你有这样的事件处理程序:
private void nameOfButtonToIdentify_Click(object sender, RoutedEventArgs e)
您可以检查 nameOfButtonToIdentify
按钮是否被点击,如下所示:
private void nameOfButtonToIdentify_Click(object sender, RoutedEventArgs e)
{
if(sender == nameOfButtonToIdentify)
{
//do stuff
}
}
Button
类型有一个 Tag
属性,但它只是一个 属性 用于存储任意信息而不是识别该控件的方法。
每个 FrameworkElement
上都有一个 Tag
属性 所以你可以这样解决。
如果您想使用更 WPFier 的方式,您应该考虑使用带有 ICommand
实现的 ViewModel。此命令可以接收一个参数,您可以在其中传递例如一个整数(或一个枚举值,这可能更易于维护)。这应该绑定到 Command
属性 而不是普通的 EventHandler。
就像我的评论说这就是我所做的
int numberForButton =0;
for (int i =0;i<100;i++)
{
Button but = new Button();
//usual place button fields
but.MouseDoubleClick += click_event;
but.Name = btn+numberForButton;
numberForButton++;
}
private void btnName_Click(object sender, MouseDoubleClick_event e)
{
//for button 97 chosen at random
if(((Button)Sender).Name.SubString(2) == 97)
{
//code what you want button 97 to do
}
}
这会在您的工作的 c# 部分创建 100 个按钮,并且所有按钮都会调用相同的事件,在该事件中,将注释放在代码中以放置您喜欢的按钮,将 100 更改为您想要的任意数量的按钮,然后关闭
您也可以使用 Lambda 调用相同的方法但得到不同的结果。
如果您需要将特定参数传递给您的点击方法
,它会更快
foreach(var element in list)
{
//...
Button btn = new Button();
btn.Click += (s,e) => YourClickMethod(element.Property);
}
抱歉,如果这个问题在 C# 术语中没有多大意义。我一直在用 Obj-C 编程,在那里,你可以给一个按钮 "tag".
我问是因为我以编程方式创建了很多按钮并让它们共享相同的 MouseDoubleClick 方法。问题是,如果没有 "tag",我无法辨别哪个按钮按下了它。希望这是有道理的?
如果您在 xaml 中定义一个按钮,如下所示:
<Button x:Name="nameOfButtonToIdentify"/>
x:Name
标签定义控件的名称。
如果你有这样的事件处理程序:
private void nameOfButtonToIdentify_Click(object sender, RoutedEventArgs e)
您可以检查 nameOfButtonToIdentify
按钮是否被点击,如下所示:
private void nameOfButtonToIdentify_Click(object sender, RoutedEventArgs e)
{
if(sender == nameOfButtonToIdentify)
{
//do stuff
}
}
Button
类型有一个 Tag
属性,但它只是一个 属性 用于存储任意信息而不是识别该控件的方法。
每个 FrameworkElement
上都有一个 Tag
属性 所以你可以这样解决。
如果您想使用更 WPFier 的方式,您应该考虑使用带有 ICommand
实现的 ViewModel。此命令可以接收一个参数,您可以在其中传递例如一个整数(或一个枚举值,这可能更易于维护)。这应该绑定到 Command
属性 而不是普通的 EventHandler。
就像我的评论说这就是我所做的
int numberForButton =0;
for (int i =0;i<100;i++)
{
Button but = new Button();
//usual place button fields
but.MouseDoubleClick += click_event;
but.Name = btn+numberForButton;
numberForButton++;
}
private void btnName_Click(object sender, MouseDoubleClick_event e)
{
//for button 97 chosen at random
if(((Button)Sender).Name.SubString(2) == 97)
{
//code what you want button 97 to do
}
}
这会在您的工作的 c# 部分创建 100 个按钮,并且所有按钮都会调用相同的事件,在该事件中,将注释放在代码中以放置您喜欢的按钮,将 100 更改为您想要的任意数量的按钮,然后关闭
您也可以使用 Lambda 调用相同的方法但得到不同的结果。 如果您需要将特定参数传递给您的点击方法
,它会更快foreach(var element in list)
{
//...
Button btn = new Button();
btn.Click += (s,e) => YourClickMethod(element.Property);
}