我有一个在运行时向按钮添加单击事件的方法。
((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()); };
我需要一种方法来检查我是否可以添加该方法,但我无法找到解决方案。
我还尝试了如何删除 lambda 事件处理程序,但没有好的结果。
确保订阅(+=
(只发生一次。当按钮添加到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 不会从附加的事件处理程序中捕获异常。 try-catch 应该在处理程序中
评论中的建议确实应该有效,但由于您所述的原因,动态添加的事件可能很危险。 您能否将按钮单击永久连接到使用您根据其他内容更改的变量的方法?喜欢:
ButtonClick(sender, args)
{
var myTarget = TargetList[sender.Name];
Process.Start(myTarget);
}