3

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

除了诉诸禁用控件或使长时间运行的操作异步,然后针对用户请求手动实现生产者-消费者模式(基本上在操作运行时忽略任何请求)之外,在 WPF 中是否有一种“奇特”的方式/技巧来执行此操作) ?

4

1 回答 1

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

主窗口xml:

IsHitTestVisible="{Binding ApplicationIdle}"
于 2013-06-13T21:23:06.227 回答