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

时间:2009-09-14 14:46:51

标签: c# .net event-handling

假设我在某个表单上有一个按钮,如果满足某些条件,我想要禁用该按钮。有没有办法在按钮的“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
 }
}

假设我在其他地方(我是)触发了这个事件。

3 个答案:

答案 0 :(得分:4)

if (someCondition && uxExportResults.IsEnabled) { ... }

如果已启用,则只会禁用您的控件。

答案 1 :(得分:3)

另一种选择是暂时禁用事件:

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

答案 2 :(得分:2)

最简单的解决方案是在设置之前检查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);
    }
  }
}