WPF 加载页面的三种方式(瞬时加载,延迟加载,异步行为)

server/2024/11/27 21:05:44/

在WPF中,瞬时加载延迟加载异步行为分别适用于不同的场景,它们各自的实现方式和用途如下:

1. 瞬时加载

定义:

在赋值或初始化时,视图和数据会立即加载,所有的逻辑在主线程上完成。视图在 UI 上的渲染几乎是同步的。

特点:
  • 快速初始化,所有逻辑一次性完成。
  • 不适合复杂或耗时操作(如大数据加载)。
示例代码:
public UserControl AppsContent { get; set; }public MainWindow()
{InitializeComponent();// 瞬时加载视图AppsContent = new AView{DataContext = new AViewModel()};ContentControlMain.Content = AppsContent;
}

2. 延迟加载

定义:

在需要使用时才加载资源或视图,通常通过懒加载(Lazy Loading)模式实现。

特点:
  • 初始时不创建对象,只有在实际访问时才实例化。
  • 节省内存,提高启动性能。
  • 适合需要动态加载的场景,如模块化界面。
示例代码:
使用 Lazy<T> 延迟加载:
 
private Lazy<AView> _lazyView = new Lazy<AView>(() => new AView
{DataContext = new AViewModel()
});public UserControl AppsContent => _lazyView.Value; // 只有访问时才初始化

手动延迟加载:

private AView _aView;
public UserControl AppsContent
{get{if (_aView == null){_aView = new AView{DataContext = new AViewModel()};}return _aView;}
}

使用 DataTemplate 延迟加载:

<ContentControl Content="{Binding CurrentView}"><ContentControl.Resources><DataTemplate DataType="{x:Type local:AViewModel}"><local:AView /></DataTemplate></ContentControl.Resources>
</ContentControl>

3. 异步行为

定义:

通过异步方法加载视图或数据,避免阻塞主线程,提高应用响应速度。

特点:
  • 数据和视图加载可并行。
  • 用户体验更流畅,但需要处理异步状态和错误。
  • 常用 async/await
示例代码:
异步加载视图:
 
public async Task<UserControl> LoadViewAsync()
{return await Task.Run(() =>{// 模拟耗时操作System.Threading.Thread.Sleep(3000);return new AView{DataContext = new AViewModel()};});
}private async void InitializeView()
{LoadingOverlay.Visibility = Visibility.Visible; // 显示 Loading 界面AppsContent = await LoadViewAsync();ContentControlMain.Content = AppsContent;LoadingOverlay.Visibility = Visibility.Collapsed; // 隐藏 Loading 界面
}
异步加载数据:

如果视图是立即加载的,可以延迟加载其数据:

public async void LoadDataAsync()
{IsLoading = true;var data = await Task.Run(() =>{// 模拟耗时数据加载return SomeService.LoadData();});MyViewModel.Data = data;IsLoading = false;
}

三者对比

特性瞬时加载延迟加载异步行为
执行时机初始化时立即加载使用时加载异步执行加载任务
性能影响初始时间较长初始时间较短,节省内存非阻塞,加载过程更流畅
适用场景小型应用,初始化逻辑简单模块化、条件性加载大型数据或复杂逻辑的加载
用户体验无额外提示,可能卡顿延迟加载内容显示 Loading 界面或进度条

 

推荐选择

  1. 瞬时加载:适合简单场景,如视图内容较少,且加载速度快。
  2. 延迟加载:适合模块化设计或需要动态加载的应用。
  3. 异步行为:适合复杂场景,加载较耗时时可与 Loading 界面结合提升用户体验。

根据需求选择合适的方法,并可以结合使用(例如延迟加载与异步行为组合)。
 


http://www.ppmy.cn/server/145432.html

相关文章

学习Prompt Turning

传统的微调因为代价很高&#xff0c;而且一旦权重很大&#xff0c;这种fine 微微的意思是调不动模型的&#xff0c;所以需要这种提示词调 mindnlp直接有 peft config peft_config PromptTuningConfig(task_type“SEQ_CLS”, num_virtual_tokens10) 方便我们进行prompt tunin…

0基础学前端系列 -- 前端的存储方式

前端存储方式全解析&#xff1a;选择最适合你的解决方案 在现代Web开发中&#xff0c;存储用户数据和状态信息是至关重要的。随着应用程序的复杂性增加&#xff0c;开发者需要选择合适的存储机制来管理用户信息。本文将深入探讨前端的存储方式&#xff0c;包括 Session、Cooki…

【linux】shell脚本

文章目录 1. jar包启动脚本1.1 方式一1.2 方式二 2. 进程关闭脚本3. 操作mysql4. impala建表语句提取5. 监控磁盘存量6. 清日志脚本7. 替换tomcat的启动端口8. 将一行数据按照空格依次读取 1. jar包启动脚本 1.1 方式一 #!/bin/sh RESOURCE_NAME/usr/local/applications/scre…

Spring集成测试

Spring集成测试是一种用于测试Spring应用程序中各个组件之间的交互和集成的测试方法。它通常用于验证应用程序的整体行为&#xff0c;而不仅仅是单个组件的功能。以下是一些常见的Spring集成测试技术和工具&#xff1a; Spring TestContext Framework: Spring提供了一个强大的测…

box-im学习

box-im gitee代码 box-im 语雀文档 box-im 在线体验

2024年11月22日Github流行趋势

项目名称&#xff1a;twenty 项目维护者&#xff1a;charlesBochet, lucasbordeau, Weiko, FelixMalfait, bosiraphael 项目介绍&#xff1a;正在构建一个由社区驱动的现代Salesforce替代方案。 项目star数&#xff1a;22,938 项目fork数&#xff1a;2,413 项目名称&#xff1…

Pytorch使用手册-Tensors(专题二)

这段代码是对 PyTorch 中张量(Tensors)的详细介绍和操作演示。以下是逐步讲解: 1. 什么是张量 (Tensor) 张量是一种专门的数据结构,与 NumPy 的多维数组(ndarray)类似: 它可以在 GPU 或其他硬件加速器上运行。张量可以与 NumPy 共享内存,避免不必要的数据拷贝。它是为…

Linux基础05

虚拟机网络模式 1.桥接模式 ​ 和Windows共享一个网段&#xff0c;并且能够与Windows系统一样可以连接到互联网 ​ 说明&#xff1a;虚拟机类似于一台电脑连接到路由器 ​ 好处&#xff1a;网络稍微会快一点 ​ 坏处&#xff1a;占用路由器的IP&#xff0c;如果路由器的载…