C# 如何将C“事件处理程序标记为”;处理;?

C# 如何将C“事件处理程序标记为”;处理;?,c#,.net,event-handling,C#,.net,Event Handling,假设我在表单上有一个按钮,如果满足某些条件,我想禁用该按钮。是否有办法在按钮的“IsEnabled”事件处理程序中检查此条件并修改启用状态,以便第二次设置启用状态不会触发对IsEnabled事件处理程序的另一次调用 让我示范一下: private void ExportResults_IsEnabledChanged (object sender, DependencyPropertyChangedEventArgs e) { if (some condition) { uxExport

假设我在表单上有一个按钮,如果满足某些条件,我想禁用该按钮。是否有办法在按钮的“IsEnabled”事件处理程序中检查此条件并修改启用状态,以便第二次设置启用状态不会触发对IsEnabled事件处理程序的另一次调用

让我示范一下:

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;
        }
    }
}