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

标签 c# .net wpf user-interface

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

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

最佳答案

执行此操作的一种方法是 Hook Dispatcher OperationStarted 和 OperationCompleted 事件。这些事件的处理程序将设置绑定(bind)到窗口的 IsHitTestVisible 属性的 bool 属性。这样,当 Dispatcher 正在处理时,它将阻止用户与 UI 交互。

例子如下:

View 模型:

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

主窗口 xaml:

IsHitTestVisible="{Binding ApplicationIdle}"

关于c# - WPF - 防止用户操作在应用程序繁忙时排队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17095888/

相关文章:

C# wpf scrollviewer 不像windows store app那样工作

c# - 重构switch语句

c# - 修改 RavenDB 中嵌套集合中的特定项

c# - 尝试在 foreach 循环中将对象 append 到 Enumerable

c# - 如何为 ASP.NET WebForms 端点允许 CORS?

c# - Entity Framework 7 中奇怪的缓存问题

c# - WPF ListView 分组和排序

wpf - 在 PRISM 4 中导航到新 View 时如何传递对象

c# - 入账当天如何计算金额

c# - 正则表达式帮助 : My regex pattern will match invalid Dictionary