响应式用户界面技巧

8

当我想创建响应式用户界面时,希望您能提供一些提示。

我知道如何使用:

Dispatcher
Task
BackgroundWorker
Threads

我正在寻找更高级的技巧,例如绑定技巧... 当我的UI上有50多个需要更新的控件时。

PriorityBinding
Populating ComboBoxes
Populating ListBoxes, ListViews

在后台处理数据时,最佳实践可能是针对长时间运行的进程。

我还能做什么来使我的UI 100%响应。

3个回答

16
  1. FastObservableCollection 快速且线程安全的可观察集合

  2. 操作PresentationSource

  3. 使用PLinq或Linq处理多线程,通过使用AsQueryable()动态过滤数据源。与单线程和线程不确定的CollectionView相比更快。

  4. 使用现成的Gifs进行动画

  5. 虚拟化非虚拟化面板(如Canvas)

  6. 延迟滚动

  7. Trigger.Exnter \ Exit Actions用于动画。

  8. BeginStoryboard.HandoffBehavior="Compose"

  9. 使用硬件加速而非软件加速。

  10. 避免使用WindowStyle=None, AllowTransparency=true, Background=Transparent, TileMode

  11. RenderOptions.BitmpaScalingMode配置为LowQuality,并启用缓存。启用PresentationFontCache Windows服务。

  12. 使用Staticresources而非Dynamicresources

  13. 避免可继承的依赖属性。同时避免在属性更改回调中执行繁重操作。

  14. 使用可冻结的画刷(Freezable brushes)。避免x:Name/Namescoping/Binding到它们的Color属性,以确保它们始终可冻结。

  • 如果边框包裹了可视内容,则设置边框的背景,否则设置可视内容的背景。同样,如果将Brush作为可视对象的背景,则指定Brush.Opacity而不是Visual.Opacity

  • 值转换器的代码必须简约。在适用的情况下使用Binding.IsAsyncPriorityBinding

  • 默认情况下使用IsExpanded=FalseExpanders

  • CompositionTarget.Rendering在每个渲染周期都会触发,因此只有在必要时才应使用它。在任何机会都要解除绑定。

  • 在WPF DataGrid中应避免大量使用组合框列和可编辑模板列,因为组合框模板会尝试从每一个组合框的项源实际搜索选定的值并使用显示成员路径,而模板列在与高度观察的集合一起使用时会泄漏。

  • 使用基于WPF扩展工具包的着色器效果和新的像素着色器API,例如模糊、阴影。

  • 还有许多其他内容...


    最终禁用所有最佳图形,并使应用程序看起来像旧式的Win 32应用程序 :) - Akash Kava

    1

    我一直觉得懒加载非常有用,可以防止一次性加载大量数据,这也是处理大量数据时启动时间最长的地方。将记录绑定到虚拟化项控件上,以最小化内存占用(显然,WPF会判断什么是必要的内存)。

    但说实话:Martin是对的...50个以上的数据绑定控件...天啊,那简直是噩梦;-)

    至于你追求100%的响应能力,我想需要进一步解释。据我理解,应用程序可以响应或不响应(接受用户输入/产生输出与被卡住无法做任何事情)。你是追求最佳性能吗?还是你面临了行锁定场景(让用户在执行某些记录的长时间任务时编辑其他记录)?

    我认为AngelWPF提到的一些内容可以在这篇很棒的文章中找到关于优先绑定的信息。


    是的,50多个控件似乎很多,但它们都同等重要。花费最长时间的部分是我的组合框中项目源的绑定...但是表单(视图)的初始加载需要很长时间。我希望表单能够快速启动,然后可以发生其余的绑定或类似的事情。当用户单击下拉列表时,由于数据量巨大,打开时间也很长...所以我有点困惑。 - Willem
    1
    好的,如果有帮助的话,请查看此文章中的信息:http://blogs.msdn.com/b/jgoldb/archive/2007/10/10/improving-wpf-applications-startup-time.aspx。 - Sebastian Edelmeier

    0

    单个UI上拥有50多个控件听起来像是由一名编码人员设计的,优化代码可能只会暂时抵消真正的问题。加快速度的最好方法是将功能分离到不同的屏幕上或将较少使用的信息隐藏在菜单后面。


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