我有一个方法可以在运行时向Button添加一个click事件。
((Button)ControlDictionary[processDataProperty.Key]).Click += (s, e) => { Process.Start(processDataProperty.Value.ToString()); };
该过程在浏览器中打开一个页面。 问题是,多次执行此代码,我得到了 多开口标签的不良影响。
我尝试了这个,但它不起作用。
((Button)ControlDictionary[processDataProperty.Key]).Click -= (s, e) => { Process.Start(processDataProperty.Value.ToString()); };
((Button)ControlDictionary[processDataProperty.Key]).Click += (s, e) => { Process.Start(processDataProperty.Value.ToString()); };
我需要一种方法来检查我是否可以添加方法,但我无法找到解决方案。
我也尝试了How to remove a lambda event handler但效果不佳。
答案 0 :(得分:0)
评论中的建议确实应该有效,但动态添加的事件可能是危险的,因为你说的原因。您是否可以将按钮单击永久连接到使用基于其他内容更改的变量的方法? 像:
ButtonClick(sender, args)
{
var myTarget = TargetList[sender.Name];
Process.Start(myTarget);
}
答案 1 :(得分:0)
您需要确保订阅(+=
)仅发生一次。按钮添加到ControlDictionary
时应该会发生。
如果出于某种原因无法做到这一点,我建议使用Button.Command作为处理Click事件的等价物。 Button.Command只能有一个值,因此它将被执行一次。
var button = (Button)ControlDictionary[processDataProperty.Key];
var cmd = new RelayCommand(() =>
{
try
{
Process.Start(processDataProperty.Value.ToString());
}
catch (Exception ex)
{
Log.Debug(ex);
}
});
button.Command = cmd;
RelayCommand是ICommand的自定义实现。还有其他实现,如DelegateCommand等。
订阅活动也是一种安全的操作。 try-catch around subscription不会捕获附加事件处理程序的异常。 try-catch应该在handler
中