当我想创建响应式用户界面时,希望您能提供一些提示。
我知道如何使用:
Dispatcher
Task
BackgroundWorker
Threads
我正在寻找更高级的技巧,例如绑定技巧... 当我的UI上有50多个需要更新的控件时。
PriorityBinding
Populating ComboBoxes
Populating ListBoxes, ListViews
在后台处理数据时,最佳实践可能是针对长时间运行的进程。
我还能做什么来使我的UI 100%响应。
FastObservableCollection 快速且线程安全的可观察集合
使用PLinq或Linq处理多线程,通过使用AsQueryable()动态过滤数据源。与单线程和线程不确定的CollectionView
相比更快。
使用现成的Gifs进行动画
虚拟化非虚拟化面板(如Canvas)
延迟滚动
Trigger.Exnter \ Exit Actions用于动画。
BeginStoryboard.HandoffBehavior="Compose"
使用硬件加速而非软件加速。
避免使用WindowStyle=None
, AllowTransparency=true
, Background=Transparent
, TileMode
将RenderOptions.BitmpaScalingMode
配置为LowQuality,并启用缓存。启用PresentationFontCache
Windows服务。
使用Staticresources
而非Dynamicresources
避免可继承的依赖属性。同时避免在属性更改回调中执行繁重操作。
使用可冻结的画刷(Freezable brushes)。避免x:Name
/Namescoping
/Binding
到它们的Color
属性,以确保它们始终可冻结。
如果边框包裹了可视内容,则设置边框的背景,否则设置可视内容的背景。同样,如果将Brush
作为可视对象的背景,则指定Brush.Opacity
而不是Visual.Opacity
。
值转换器的代码必须简约。在适用的情况下使用Binding.IsAsync
和PriorityBinding
。
默认情况下使用IsExpanded=False
的Expanders
。
CompositionTarget.Rendering
在每个渲染周期都会触发,因此只有在必要时才应使用它。在任何机会都要解除绑定。
在WPF DataGrid
中应避免大量使用组合框列和可编辑模板列,因为组合框模板会尝试从每一个组合框的项源实际搜索选定的值并使用显示成员路径,而模板列在与高度观察的集合一起使用时会泄漏。
使用基于WPF扩展工具包的着色器效果和新的像素着色器API,例如模糊、阴影。
还有许多其他内容...
单个UI上拥有50多个控件听起来像是由一名编码人员设计的,优化代码可能只会暂时抵消真正的问题。加快速度的最好方法是将功能分离到不同的屏幕上或将较少使用的信息隐藏在菜单后面。