WPF - 在应用程序繁忙时阻止用户操作排队

时间:2013-06-13 19:58:35

标签: c# .net wpf user-interface

在应用程序繁忙时(这意味着UI线程被阻止执行某些操作),您会建议忽略用户请求(如鼠标单击)的方法。具体示例可能是网格控件的排序。如果我们说排序很慢,那么当操作正在运行时,我想忽略额外的非常多的用户点击,这些点击堆积并多次执行操作。

在WPF中是否存在“花哨”的方法/技巧,除了诉诸禁用控件,或使长时间运行的操作异步,然后手动为用户请求实现生产者 - 消费者模式(基本上忽略操作时的任何请求)正在运行??

1 个答案:

答案 0 :(得分:3)

执行此操作的一种方法是挂钩Dispatcher OperationStarted和OperationCompleted事件。这些事件的处理程序将设置一个布尔属性,该属性绑定到窗口的IsHitTestVisible属性。这样,当Dispatcher处理它时,它将阻止用户与UI交互。

这方面的一个例子如下:

<强>视图模型:

    private bool _appIdle = true;

    private void Hooks_OperationStarted(object sender, DispatcherHookEventArgs e)
    {
        ApplicationIdle = false;
    }

    private void Hooks_OperationCompleted(object sender, DispatcherHookEventArgs e)
    {
        ApplicationIdle = true;
    }

    public bool ApplicationIdle
    {
        get { return _appIdle; }
        set
        {
            _appIdle = value;
            RaisePropertyChanged("ApplicationIdle");
        }
    }

    public MainWindowViewModel()
    {
        Application.Current.Dispatcher.Hooks.OperationStarted += Hooks_OperationStarted;
        Application.Current.Dispatcher.Hooks.OperationCompleted += Hooks_OperationCompleted;
    }

MainWindow xaml:

IsHitTestVisible="{Binding ApplicationIdle}"