C# 如何将C“事件处理程序标记为”;处理;?
假设我在表单上有一个按钮,如果满足某些条件,我想禁用该按钮。是否有办法在按钮的“IsEnabled”事件处理程序中检查此条件并修改启用状态,以便第二次设置启用状态不会触发对IsEnabled事件处理程序的另一次调用 让我示范一下:C# 如何将C“事件处理程序标记为”;处理;?,c#,.net,event-handling,C#,.net,Event Handling,假设我在表单上有一个按钮,如果满足某些条件,我想禁用该按钮。是否有办法在按钮的“IsEnabled”事件处理程序中检查此条件并修改启用状态,以便第二次设置启用状态不会触发对IsEnabled事件处理程序的另一次调用 让我示范一下: private void ExportResults_IsEnabledChanged (object sender, DependencyPropertyChangedEventArgs e) { if (some condition) { uxExport
private void ExportResults_IsEnabledChanged (object sender, DependencyPropertyChangedEventArgs e)
{
if (some condition)
{
uxExportResults.IsEnabled = false; // this will cause another call to the event handler, eventually resulting in a stack overflow
}
}
假设我正在其他地方触发事件(我就是)
这只会在控件启用时禁用它。最简单的解决方案是在设置之前检查IsEnabled的值
private void ExportResults_IsEnabledChanged (object sender, DependencyPropertyChangedEventArgs e)
{
if (uxExportResults.IsEnabled == true)
{
uxExportResults.IsEnabled = false;
}
}
此外,如果您能够更改按钮的代码,IsEnabled不应发送事件,除非值实际发生更改
public bool IsEnabled
{
get { return isEnabled; }
set
{
if(isEnabled != value)
{
isEnabled = value;
IsEnabledChanged(this,args);
}
}
}
另一个选项是临时禁用事件,如下所示:
private void ExportResults_IsEnabledChanged (object sender, DependencyPropertyChangedEventArgs e)
{
if (some condition)
{
uxExportResults.IsEnabledChanged -= ExportResults_IsEnabledChanged;
try
{
uxExportResults.IsEnabled = false; // this will cause another call to the event handler, eventually resulting in a stack overflow
}
finally
{
uxExportResults.IsEnabledChanged += ExportResults_IsEnabledChanged;
}
}
}
这一定是此按钮实现的特定问题。许多属性更改事件不会触发,除非值实际发生更改。假设我在其他地方触发该事件。我会补充这个细节。Jon,我只是打字不够快,你的答案就在我打字的时候出现了。嗯,这听起来是个好主意,只是它似乎没有禁用事件处理程序。你是对的,它没有禁用事件处理程序;它停止侦听特定实例的事件。如果此处理程序正在侦听多个按钮上的事件,它将继续接收这些事件。可能您多次添加了相同的事件侦听器?我会在每一行上放置一个断点,比如“uxExportResults.IsEnabledChanged+=”来查看它们是否被多次调用。
private void ExportResults_IsEnabledChanged (object sender, DependencyPropertyChangedEventArgs e)
{
if (some condition)
{
uxExportResults.IsEnabledChanged -= ExportResults_IsEnabledChanged;
try
{
uxExportResults.IsEnabled = false; // this will cause another call to the event handler, eventually resulting in a stack overflow
}
finally
{
uxExportResults.IsEnabledChanged += ExportResults_IsEnabledChanged;
}
}
}