示例:WPF中使用IsAsync的方式绑定数据来优化用户体验

一、目的:开发过程中,有时需要绑定大量数据,比如弹出一个窗口,窗口中包含一个ListBox绑定了大量数据,这时会出现点击按钮后出现假死卡顿影响用户体验,这理通过用IsAsync的方式将窗口优先弹出来再加载数据

二、演示

在未使用IsAsync绑定的效果

可以看到,点击按钮时卡了一会才弹出窗口显示数据,代码如下

首先,生成10000条数据

cs 复制代码
    internal class MainViewModel : NotifyPropertyChangedBase
    {
        private ObservableCollection<string> _collection = new ObservableCollection<string>();
        public ObservableCollection<string> Collection
        {
            get { return _collection; }
            set
            {
                _collection = value;
                RaisePropertyChanged("Collection");
            }
        }

        public MainViewModel()
        {
            var source = Enumerable.Range(0, 10000).Select(x => x.ToString()).ToObservable();
            this.Collection = source;
        }
    }

之后直接绑定到ListBox

XML 复制代码
        <ListBox ItemsSource="{Binding Collection}"  
                 VirtualizingPanel.IsVirtualizing="False">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Image Source="1.jpeg"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ListBox>

下面演示用IsAnsyc的方式绑定效果

可以看到窗口会立即弹出来,之后去加载数据,代码如下

XML 复制代码
        <ListBox ItemsSource="{Binding Collection,IsAsync=True}"  
                 VirtualizingPanel.IsVirtualizing="False">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Image Source="1.jpeg"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ListBox>

其中{Binding Collection,IsAsync=True}就是启用IsAsync功能。

本质上启动页面后还是会卡,但用户体验不同,可以在窗口上加一个"正在加载,请等待",让用户知道这块需要等待一下,而不是感觉程序崩溃掉了。

原理跟BeiginInvoke类似,优先去弹出窗口,后面去加载数据,在不需要立即显示的数据上可以应用IsAsync功能已达到优化加载体验的效果。

三、环境

VS2022

四、示例

五、需要了解的知识点

Binding.IsAsync 属性 (System.Windows.Data) | Microsoft Learn

六、源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

七、了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

相关推荐
敲代码的嘎仔1 天前
从集群锁失效到异步领券:我用分布式锁 + Redisson + MQ 把领券接口 RT 从 200ms 压到 15ms
java·数据库·redis·分布式·缓存·ai·wpf
闲云自留地1 天前
OpenStack 的身份管家:Keystone 令牌、RBAC 权限模型拆解
wpf·openstack
FuckPatience3 天前
WPF 窗体唤醒,判断是否已存在,存在则弹出
wpf
程序员清风3 天前
从单体应用到微服务:后端系统拆分的基本方法
微服务·架构·wpf
FuckPatience4 天前
WPF 改变根据某一列条件改变行样式
wpf
dalong105 天前
WPF:DataGrid样式
wpf
是立不是利5 天前
第二篇:CSS 与用户体验——看不见的设计
前端·css·ux
samble7 天前
从零搭建工业控制系统(二十二):线程安全与并发控制
c#·wpf·并发·mvvm·线程安全·工业控制
object not found7 天前
从 Page Design 到 System Design:我对 UI/UX 的一次认知变化
ui·ux
姜穆澜7 天前
OneID 从 0 到 1 完整生产案例(三)
大数据·wpf