WPF - 防止应用程序繁忙时用户操作排队等待

3
你有什么建议来忽略用户请求(如鼠标点击),同时应用程序正在忙碌中(意味着UI线程正在执行某些操作)。具体的例子可能是对网格控件进行排序。如果我们认为排序很慢,在操作运行时,我想忽略额外的紧张用户点击,这些点击会不断积累并多次执行操作。
在WPF中,除了禁用控件或使长时间运行的操作异步化,并手动实现生产者-消费者模式以处理用户请求(即在操作运行时忽略任何请求)之外,还有没有“花哨”的方法或技巧可供使用?

作为一种简单明了的选择,当然可以...还有其他意见吗?也许不需要为每个操作都添加额外的变量,而是在用户界面层面上防止用户行为? - Denis Biondic
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;
    }

MainWindow xaml:

IsHitTestVisible="{Binding ApplicationIdle}"

1
请注意,将“IsHitTestVisible”设置为false不会阻止用户通过键盘与应用程序进行交互。 - Federico Berasategui
谢谢HighCore,这是正确的。这个解决方案不会阻止键盘输入。 - Richard E
我看不出OperationStarted是否等同于OperationPosted - Robert Gowland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接