示例: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个人主页-哔哩哔哩视频

相关推荐
脚踏实地皮皮晨16 小时前
003002004_WPF Panel 基类 官方类定义
开发语言·windows·算法·c#·wpf·visual studio
湿滑路面1 天前
Rouyan:使用WPF/C#构建的基于LLM的快捷翻译小工具
开发语言·c#·wpf
软萌萌的11 天前
C#中的多级缓存架构设计与实现深度解析
缓存·c#·wpf
dalong101 天前
WPF:3D正八面体自动旋转
3d·wpf
丙氨酸長鏈2 天前
WPF 引用 ASP.NET Core 的 AOT 版本
后端·asp.net·wpf
Xin_ye100862 天前
第六章:破局——WPF内存泄漏解决方案
c#·wpf
FuckPatience2 天前
WPF Button Content 的StringFormat
java·前端·wpf
dalong103 天前
WPF:3D正四面体旋转改错
3d·wpf
dalong103 天前
WPF:3D正四面体自动旋转
3d·wpf
He BianGu3 天前
【WPF-Control】二次开发总览
wpf