为什么我的忙碌指示器在我点击时工作但不是默认按钮?

时间:2010-09-16 14:54:58

标签: wpf

难以在一行中描述,所以这里是细节。

之前我问过一个问题,即在WPF窗口中显示忙碌指示符,同时执行一些长时间运行的操作。最初的问题是here

我从评论中提出了一些建议,提出了一种“DoEvents”风格的解决方法。我知道这不是理想的但我只有几个小时的时间来为大约50个窗口添加繁忙的指示器,他们在UI线程上都有很多代码,我没有时间修改使用后台线程(我希望在没有额外的头痛的情况下整夜整理它。)

因此,在我的viewmodels中设置“Busy”属性后,我运行以下DoEvents样式代码:

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate {  }));

现在,当我单击启动长时间运行过程的按钮时,等待指示符会出现,因为我需要它,一切都很顺利。但是,有问题的按钮是窗口中的默认按钮。如果我按Enter键,则使用相同的命令绑定,我可以在调试模式下看到以完全相同的方式访问代码。但是,忙碌指示符不会显示。

有人可以建议一种让我今晚睡个不醒的工作方法吗?

1 个答案:

答案 0 :(得分:1)

如果您接受使用“标准”Windows等待光标,则可以在启动操作时将Window的Cursor属性设置为Cursors.Wait,然后在长时间运行操作结束时将其设置为null(或使用Mouse.OverrideCursor)。

我将它包装在IDisposable类中:

/// <summary>
/// Helper to display a wainting cursor for the whole application
/// </summary>
public class WaitingCursor : IDisposable {

private Cursor m_currentCursor;

public WaitingCursor() {

    Enable();
}

/// <summary>
/// Sets the cursort to the waiting cursor
/// </summary>
public void Enable() {

    m_currentCursor = Mouse.OverrideCursor;
    Mouse.OverrideCursor = Cursors.Wait;
}

/// <summary>
/// Restores the cursor to the default one
/// </summary>
public void Disable() {
    Mouse.OverrideCursor = m_currentCursor;
}

#region Implementation of IDisposable

/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose() {
    Disable();
}

#endregion

}

然后,人们可以简单地写:

using (new WaitingCursor()) {

   ... // long-running op
}