【问题标题】:Set in the GUI content blocked user actions在 GUI 内容中设置阻止用户操作
【发布时间】:2012-05-14 10:27:01
【问题描述】:

以下问题:

我想在程序中上传文件,用户应该可以进行设置。 因为文件非常大,我想将它们加载到一个新线程中,以便用户可以在 GUI 中进行其他设置。 (速度:快)

  1. 用户选择文件
  2. 程序启动一个新线程
  3. 线程正在加载文件
  4. 程序调用调度程序将文件设置到布局中

到目前为止一切顺利,第一步到第三步没有问题。

但在第 4 步中,我创建了一个 Dispatcher.Invoke。

private void SetNewContent(object newContent)
{
    _userControl.Dispatcher.Invoke(
        DispatcherPriority.Normal,
        new System.Action(
            delegate()
            {
                _userControl.SetContent(newContent);
            }
        )
    };
}

_userControl.SetContent 方法很慢。 10,000 个页面的方法大约需要 5 秒,这对于用户来说太长了。在此期间,用户无法更改 GUI 设置。

有没有可能阻止它?

【问题讨论】:

    标签: c# multithreading user-interface user-interaction


    【解决方案1】:

    您不应该一次渲染所有内容。仅显示可见内容。
    如果“newContent”是一个集合(或者可以包装到集合中),您可以通过“ItemsSource”属性将它绑定到任何 WPF 列表控件 - 它们是虚拟的,因此它们只会呈现可见项目。

    【讨论】:

      【解决方案2】:

      我们遇到了类似的问题,归结为没有使用我们使用的网格控件的“虚拟化”模式。在虚拟模式下,它只会为可见部分构建 UI 元素,并在稍后滚动时重复使用(而不是一次性构建所有 10,000 个元素)

      您使用什么样的控件(哪个供应商?即 Infragistics/Telerik/DevExpress)来显示日期?检查它是否支持虚拟化,现在大多数都支持。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        • 2021-02-24
        • 2016-02-04
        • 2017-05-21
        • 2017-11-02
        相关资源
        最近更新 更多