【问题标题】:WPF - prevent user actions queuing-up while application is busyWPF - 防止用户操作在应用程序繁忙时排队
【发布时间】:2013-06-13 19:58:34
【问题描述】:

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

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

【问题讨论】:

  • 作为一个简单直接的选择,当然……还有其他意见可能不需要为每个操作处理额外的变量,而是阻止用户在 UI 级别进行操作?

标签: c# .net wpf user-interface


【解决方案1】:

一种方法是挂钩 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}"

【讨论】:

  • 请注意,将IsHitTestVisible 设置为 false 不会阻止用户通过键盘与应用程序交互。
  • 感谢 HighCore,这是真的。此解决方案不会阻止键盘输入。
  • 我没有看到 OperationStartedOperationPosted 等效?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
相关资源
最近更新 更多