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

相关推荐
飞人博尔特的摄影师4 小时前
WPF绑定Bind方法合集,实时更新
visualstudio·c#·wpf·xaml·maui·xamarin·技巧
2401_854391084 小时前
SpringBoot社团管理:用户体验优化
spring boot·后端·ux
zxb11c5 小时前
wpf 事件转命令的方式
wpf
冷眼Σ(-᷅_-᷄๑)6 小时前
WPF异步UI交互功能的实现方法
c#·wpf
shepherd枸杞泡茶9 小时前
WPF触发器
wpf
公子小六12 小时前
在WPF程序中实现PropertyGrid功能
windows·microsoft·c#·.net·wpf
当下就是最好1 天前
WPF应用程序的生命周期-笔记
wpf
九鼎科技-Leo2 天前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
麻花20132 天前
C#之WPF的C1FlexGrid空间的行加载事件和列事件变更处理动态加载的枚举值
开发语言·c#·wpf
lcintj2 天前
【WPF】Prism学习(九)
学习·wpf·prism