XAML 的延迟加载

2024-03-09

我正在处理的一个项目有一些相当复杂的 XAML,它明显影响了视觉性能。相当多的控件在初始状态下是折叠的;然而,由于它们的 XAML 已被解析并构建了可视化/逻辑树,因此显示几乎空白对象的速度非常慢。

看起来(并且需要在此确认)使用初始状态为 Collapsed 的 ContentControl,然后将所需的控件作为该 ContentControl 的 DataTemplate 嵌入,将推迟在 DataTemplate 中加载所需的控件,直到 ContentControl 可见。

我构建了一个通用的 DeferredContentControl 来监听主 UI 控件的 LayoutUpdated 事件(一般来说,无论我想要快速显示的元素是什么),当该 UIElement 的第一个 LayoutUpdated 事件触发时,我使用 Dispatcher 来翻转DeferredContentControl 的可见性设置为 true,这会导致 DeferredContentControl 的 DataTemplate 中的控件进行实例化。当用户对屏幕的初始视图(现在速度很快)做出反应时,数据模板中的“加载缓慢”(但仍然折叠)控件已准备就绪。

这看起来是一个合理的方法吗?有什么陷阱吗?它似乎在 Silverlight 和 WPF 的测试中都表现良好,虽然它没有使事情变得更快,但在我的特定场景中,它给人的感觉是快了 50%。


我遇到了同样的问题(在 Silverlight 项目中),并以几乎相同的方式解决了它。事实证明,它按预期工作,尚未遇到任何陷阱。

当您需要控制解析 xaml 和实例化视图元素的时间点时,您始终可以使用DataTemplates(不一定要与ContentControl)。您可以致电DataTemplate.LoadContent()要实例化它,您不必切换 ContentControl 的可见性(尽管在内部这将导致这样的 Load Content 调用)。

如果您愿意,请查看我的实现,它甚至可以在构建较重的 VisualTree 时显示静态文本消息:

<DeferredContent HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <DeferredContent.DeferredContentTemplate>
        <DataTemplate>
            <MyHeavyView/>
        </DataTemplate>
    </Controls:DeferredContent.DeferredContentTemplate>
    <TextBlock Text="Loading content..."/>
</Controls:DeferredContent>

和代码

public class DeferredContent : ContentPresenter
{
    public DataTemplate DeferredContentTemplate
    {
        get { return (DataTemplate)GetValue(DeferredContentTemplateProperty); }
        set { SetValue(DeferredContentTemplateProperty, value); }
    }

    public static readonly DependencyProperty DeferredContentTemplateProperty =
        DependencyProperty.Register("DeferredContentTemplate",
        typeof(DataTemplate), typeof(DeferredContent), null);

    public DeferredContent()
    {
        Loaded += HandleLoaded;
    }

    private void HandleLoaded(object sender, RoutedEventArgs e)
    {
        Loaded -= HandleLoaded;
        Deployment.Current.Dispatcher.BeginInvoke(ShowDeferredContent);
    }

    public void ShowDeferredContent()
    {   
        if (DeferredContentTemplate != null)
        {
            Content = DeferredContentTemplate.LoadContent();
            RaiseDeferredContentLoaded();
        }
    }

    private void RaiseDeferredContentLoaded()
    {
        var handlers = DeferredContentLoaded;
        if (handlers != null)
        {
            handlers( this, new RoutedEventArgs() );
        }
    }

    public event EventHandler<RoutedEventArgs> DeferredContentLoaded;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XAML 的延迟加载 的相关文章

  • DataGrid、TextBox - 绑定和即时更新

    我的应用程序 包含图中的窗口 DataGrid 的 ItemsSource 设置为 editList 声明为 IList editList 数据网格设置为只读 供应商名称文本框的绑定设置为 Text Binding ElementName
  • 您应该在 Windows 8 应用程序的哪个位置编写“隐私策略”代码?

    我的应用程序未通过认证 原因是 4 1 1 如果您的应用程序具有网络功能 则必须有隐私声明 您必须在应用程序的说明页面以及 Windows 设置超级按钮中显示的应用程序设置中提供对隐私政策的访问权限 他们在说什么 什么描述 如何设置 Win
  • WPF 简单绑定到 INotifyPropertyChanged 对象

    我创建了最简单的绑定 绑定到后面代码中的对象的文本框 但事件 文本框仍为空 窗口的 DataContext 已设置 并且绑定路径已存在 你能说出什么问题了吗 XAML
  • 如何将 TargetNullValue 设置为日期?

    我使用 WPF 工具包的日历控件来允许用户选择日期 如果尚未选择日期 则 SelectedDate 绑定到的属性为 Null 这使得日历默认为公元 0 年 1 月 1 日 我想做类似的事情 SelectedDate Binding User
  • 如何在 xamarin.forms 中隐藏列表视图的空行

    我有一个StackLayout with a ListView我有一个添加按钮 我想将其显示在ListView 但是ListView显示许多未使用的行 只是空行 这迫使我的按钮显示在页面底部 我一直在搞乱VerticalOptions一整天
  • Silverlight xaml TextBlock.Text 与 CDATA 在运行时未显示?

    以下 xaml 会生成文本 激活左侧测试 在运行时和设计时可见 在 Vs2010 中
  • Tabcontrol 中的 SelectedIndex 不变 - 调度程序问题

    为什么在我设置 SelectedIndex 0 后 我随后 而不是响应 得到使用 SelectedIndex 4 调用的事件处理程序 我追踪到对调度程序的调用 但我不明白为什么 计划如下 我有一个页面 其中包含带有各种选项卡的选项卡控件 当
  • 如何使用 wpf webbrowser 将数据发布到 Web 服务器

    我想从数据库获取数据并使用它来让用户登录到网站 我有一个包含 Web 浏览器控件的 wpf 页面 我有这样的代码 用于将用户登录到用 php 编写的网站
  • Windows 8 和 LOB 应用程序

    为 Windows 8 构建业务线应用程序的推荐方法是什么 例如复杂的定制财务应用程序 它们显然不适合 Metro 风格 因此可能会成为常规桌面应用程序 那么建议使用WPF吗 有 vNext 吗 我作为开发人员构建的应用程序类型是桌面风格的
  • 从 WPF 绑定列表框中删除项目

    我有一个带有 ListBox 称为 listMyItems 的 WPF 应用程序 它已成功绑定到我创建的 MyItems 类 我有一个名为 currentMyItems 的 MyItems 列表 然后将其作为 ItemSource 分配给
  • 如何从外部类库(通过 NuGet 包)引用 UserControl?

    是否可以在驻留在 UWP 类库中的 UWP 应用项目中引用和使用 UserControl 我尝试在类库中创建 UserControl 但是当我尝试在应用程序中使用它时 我得到 App1 exe 中发生 Windows UI Xaml Mar
  • 设置 TextBlock 以保留开头和结尾的空白?

    EDIT 下面的代码实际上按照我想要的方式工作 这个问题有点误导 请忽略它 通常当我设置Text的财产TextBlock像这样 TextBlock tb new TextBlock tb Text Hello World 文本开头和结尾的空
  • 在 WPF 中打开 ContextMenu 时保留 DataGrid IsSelectionActive?

    我有一个DataGrid其风格为IsSelectionActive 然而 一旦ContextMenu打开 网格丢失IsSelectionActive在用户看来 上下文菜单似乎以某种方式进行了选择 可能会让用户感到困惑 有没有办法保留IsSe
  • 如何从注册表获取安装的软件路径?

    我需要替换安装在任何驱动器 如 C D E 中的文件 我想从注册表中找到安装的文件路径并将该文件替换为其他文件 软件将安装在任何驱动器中 我想替换文件 我正在使用这段代码 如何使用注册表查找安装的文件路径并替换为 C 中的其他文件 stri
  • Xaml 不知道哪些对象是在不同的程序集中定义的

    当我在一些非类中添加一个类时UI组装并在某些中使用它xaml in UI assembly出现以下错误 Provide value on System Windows StaticResourceExtension threw an exc
  • Silverlight WCF服务跨域问题

    我有一个 silverlight 应用程序 托管在 Intranet mydomain net 和一个 WCF 服务 webservices mydomain net 我需要跨站点策略文件吗 如果是这样 只允许从 Intranet mydo
  • Xamarin Forms 框架阴影设计

    我有一个带有列表的 Xamarin 内容页面 对于 ListItems 我想要类似于 Android 中的卡片视图的东西 根据我发现可以通过框架来完成 我有这个代码
  • WPF应用程序,在打开窗口之前运行异步任务

    我遇到了一个问题 我需要在主窗口打开并显示之前运行异步任务 IE STAThread static void Main string args MainWindow window new MainWindow SplashScreen Sh
  • 需要帮助处理 Application.xaml 文件中的 DataTemplate 事件

    我的应用程序中有一个包含几个按钮的数据模板 我希望这些按钮的偶数处理程序在当前页面 我在许多页面中使用此模板 而不是在 Application xaml vb cs 文件中触发 因为我希望在每个页面上执行不同的操作 我希望我说清楚了 您可以
  • 按钮 VisualState Focused 不起作用

    我试图在单击按钮时更改按钮的字体颜色 我尝试了很多不同的方法 但没有一个有效 这是我尝试过的最新方法 我认为应该是答案 但它不起作用 有人可以帮忙吗 PointerOver 工作正常 但单击按钮时 Focused 没有执行任何操作

随机推荐

  • 如何在java中更新文本文件的某些部分

    我希望能够更新文本文件中的某一行 但我收到错误 无法删除该文件 为什么会收到此错误 public class Main public static void main String args Main rlf new Main rlf re
  • Pandas GroupBy 和计算 Z 分数 [重复]

    这个问题在这里已经有答案了 所以我有一个如下所示的数据框 pd DataFrame 1 10 14 1 12 14 1 20 12 1 25 12 2 18 12 2 30 14 2 4 12 2 10 14 columns A B C A
  • 如何在 Pygame 中显示精灵?

    这只是一个关于 PyGame 中精灵的简单问题 我按照下面的代码加载了图像 我只是想知道如何在 PyGame 中显示精灵 例如绘制矩形或圆形 无论如何 我不想让它表现得如此 我想我用一个blit命令 但我不确定并且我在网上没有找到太多信息
  • 多线程环境登录并测试

    请让我知道您在以下场景中如何设计日志记录以及如何测试日志记录的建议 我有一个可以由多个线程调用的 API 单个线程对该 API 的一次调用会生成 50 KB 的日志 是否存在用于在多线程环境中进行日志记录的设计模式 IE所有线程使用一个日志
  • 如何在 Kotlin 中手动将字节分配给 long?

    我正在尝试做这样的事情Kotlin val top Long 1000000 1000000 1000000 1000000 1000000 1000000 1000000 In Java它看起来像这样 long TOP 1000000 1
  • lambda 函数比委托/匿名函数更快吗?

    我以为lambda functions delegates and anonymous functions具有相同的主体将具有相同的 速度 但是 运行以下简单的程序 static void Main string args List
  • 用于捕获 MSWord 文档事件的 IAdviseSink 设置

    这是我尝试设置的代码IAdviseSink在我的接口中实现的TForm1用于捕获新创建的 MSWord 文档的一些事件的类 代码运行时没有任何错误 但在保存文档或关闭文档时无法捕获任何事件 如何设置IAdviseSinkMSWord 文档正
  • 如何删除 Google 地图 v2 中的标记?

    我使用以下方法在地图上添加了标记 并保留了标记记录 public static void showallLocations ArrayList
  • 如何在 Angular 2 中触发 ajax 请求?

    我在 Angular 2 中定义了这样的服务 import Inject from angular2 angular2 import Http Headers HTTP PROVIDERS from angular2 http export
  • 为什么docker容器内存使用不减少?

    我正在运行 Java REST 应用程序Apache JavaSpark http sparkjava com 在此容器中 但我注意到每个请求都会增加内存使用量 并且在请求完成后不会减少内存使用量 我的第一个猜测是我忘记关闭一些流 缓冲区
  • 针对 PGPool II 的 Java 查询导致“未命名的预准备语句不存在”错误

    我有一个使用 Postgres 数据库的 Java 应用程序 我正在尝试引入 PGPool 来扩展我的数据库 我遇到了一个问题 Postgres 抛出以下错误 unnamed prepared statement does not exis
  • 缩放图像保持纵横比,然后在流体高度和宽度 DIV 内垂直和水平居中

    好吧 这有点拗口 而且非常具体 我会尽力解释 目标是在缩放图像时保持纵横比 并使其在仅由百分比定 义的 DIV 内保持垂直和水平居中 图像需要保持最佳拟合 因此如果需要最大宽度 则使用它 反之亦然 Use Firefox 版本 33 或一些
  • 如何在 R 中编写 .bin 文件并在 Fortran 中打开它

    我有一个 Fortran 模型 我想强制使用来自 R 开发的模型的数据 但我在两个环境之间传输数据时遇到问题 我正在考虑使用 bin 文件 我在 R 中所做的是使用writeBin将多维数组存储在 bin 文件中 a seq 1 150 1
  • hibernate @Entity 仅在内部类上(顶级类不是 @Entity)

    我想将内部类保留到数据库中 但这不起作用 有可能这样做吗 或者我应该将该内部类放入新的普通文件中 现在我收到错误 IllegalArgumentException Unknown entity models foo bar 我的班级文件 p
  • 在android语音识别中,如何增加考虑输入完成的时间?

    在android语音识别中 任何人都可以知道如何增加我们停止听到语音后考虑输入可能完成所需的时间 我需要防止端点在语音识别时在非常短的语音中间停顿期间中断 如果有人知道解决办法 请回复 任何回应将不胜感激 提前致谢 你好 我也遇到这个问题
  • jQueryUI 自动完成 - 当没有返回结果时

    我想知道当使用时从服务器返回空结果时如何捕获并添加自定义处理程序jQueryUI 自动完成 http jqueryui com demos autocomplete 在这一点上似乎有一些与各种 jQuery 插件相关的问题 例如当结果为空时
  • 从作为 Azure Web App 托管的 ASP.NET 5 应用程序进行日志记录

    我有一个 ASP NET 5 Web API 作为 Web 应用程序托管在 Azure 中 我想使用 Azure 诊断记录我的代码中的消息 有多篇文章包括Azure 文档 https azure microsoft com en us do
  • Azure Web 角色进程未加载 web.config?

    我正在 Windows Azure 模拟器中运行一个 Web 项目 但未加载 web config 我正在作为完整的 IIS 应用程序运行 在 dev Fabric 启动后 我可以转到在 IIS 中运行的应用程序 浏览到文件位置 并验证文件
  • 不要在 git grep 输出中显示 ^M(回车符)

    为了隐藏可怕的事情 M字符来自git diff 必须配置 core whitespace cr at eol 但它们仍然显示在git grep输出 怎么解决呢 编辑 我正在运行的 grep 是 git grep i line number
  • XAML 的延迟加载

    我正在处理的一个项目有一些相当复杂的 XAML 它明显影响了视觉性能 相当多的控件在初始状态下是折叠的 然而 由于它们的 XAML 已被解析并构建了可视化 逻辑树 因此显示几乎空白对象的速度非常慢 看起来 并且需要在此确认 使用初始状态为