如何在WPF中绘制1216个画布元素而不挂应用程序

2023-12-09

我正在开发一个应用程序,我想添加一些很酷的图标。因为我使用的是漂亮的 MahApps 库,所以我想在 MahApps.Metro/MahApps.Metro.Resources/Icons.xaml 中对图标进行可视化,所以我做了一些字符串操作来获取x:Key每个的一部分<Canvas x:Key="appbar_3d_3ds" Width="76" Height="76" Clip="F1 M 0,0L 76,0L 76,76L 0,76L 0,0">线。简而言之,我所做的所有字符串操作最终得到了以下 1216 个副本:

<controls:Tile
Title="appbar_zune" Count="1215" Grid.Row="121" Grid.Column="15" TiltFactor="2" Width="1*" Height="1*"  VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<Rectangle Margin="0" Fill="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=Foreground}">
<Rectangle.OpacityMask>
<VisualBrush Stretch="Fill"
Visual="{StaticResource appbar_zune}" />
</Rectangle.OpacityMask>
</Rectangle>
</controls:Tile>

请注意,每个副本<control:Tile具有适当的属性Count, Grid.Row and Grid.Column正确设置。

然而,我总是以Application not responding窗口消息。现在,正如我所说,我的动机只是为了直观地了解这些漂亮的图标集合,但我却遇到了严重的应用程序崩溃。我只是想知道是否有一种方法可以显示如此庞大的集合而不会使任何人的计算机崩溃(注意:系统的 RAM 确实很低:我在 virtualbox 中运行的测试机器之一)。


首先,使您的 Fill 绑定具有 Mode=OneWay。我敢打赌你不需要它是 TwoWay 并且它可能是你设置中的默认值。 TwoWay 绑定的成本要高得多。

其次,考虑使用更严格的版本:Mode=OneTime。由于图标不太可能更改,因此您根本不需要任何更改跟踪。这将为您节省更多资源。

就您而言,第一+第二可能不会给您带来巨大的推动,但值得尝试和记住。

第三,你的情况如何VisualBrush是吗?他们都使用相同的吗Visual="{StaticResource appbar_zune}"?那么为什么要创建数千个实例呢?不要复制粘贴,只需创建一个实例并使所有项目都使用该实例。您可以节省大量时间和内存。

第四,也是最重要的,通常会带来最大的加速,是 - 你有tons的项目。我打赌你有一些滚动,水平或垂直的。但是如何生成并显示这些项目呢?一次性创建它们是..浪费的。它们不能全部显示在屏幕上,对吗?

您是否有一些 ItemsControl 可以生成那千个项目?调查ItemsPanel该 ItemsControl 的属性并打开virtualizing该面板上的选项。这将导致它链接到滚动条,并且它将开始动态地仅创建屏幕上的项目并销毁移出屏幕的项目。好吧,我把它过于简单化了,但可以说它是这样工作的。请注意,容器如ListBox(以及许多其他)也是一个 ItemsControl,因此它也适用于此处。

或者也许您有巨大的显式 XAML 文件,其中包含数千个控件StackPanel没有 ItemControl?这其实不太明智。但是哦好吧..你仍然可以打开virtualization在那个 StackPanel 上。

如果您有超过几十个项目,那么打开虚拟化通常是一个好主意。通常,你有一百个,它是必须的,如果你达到数千个或更多,它也是必须的。然而,虚拟化成本:它经常重置/重新初始化项目。如果你的ItemTemplate真的很复杂,虚拟化可能会导致滚动变得“锯齿/滞后”,我不知道如何用英语表达,抱歉。合成器线程可能根本没有足够的时间来重新计算和重新布局所有快速移动的项目。如果您遇到该问题,请尝试设置Height的项目到一个不变的真正固定的恒定值。它对于加快布局速度有很大帮助。但如果您的 ItemTemplate 确实非常复杂,那么它也可能无济于事。在这种死胡同的情况下,您唯一的选择是......重新设计并简化项目模板。

EDIT:

当然,如果您没有滚动条并且您试图一次显示大量项目,那么所有这些都不会为您带来任何好处。在这种情况下,努力简化或删除绑定、模板、组件嵌套(有时手动计算位置比使用三个嵌入网格更好),使用渲染缓存或(...).. 抱歉,我开始做出太多猜测,太多选择..

EDIT:

我刚刚注意到Width="1*" and Stretch,所以顶部可能有一个 Grid,而不是 StackPanel。由于您希望它们大小相等,因此UniformGrid可能会有更好的表现。此外,通过一些工作,您也可以将虚拟化添加到网格中:

  • 从 4.5 及更高版本开始,变得更容易 -文章:WPF 4.5 新虚拟化功能
  • below, it requires more work, see Dan Crevier's 4-part series blog:
    • One: http://blogs.msdn.com/dancre/archive/2006/02/06/implementing-a-virtualized-panel-in-wpf-avalon.aspx
    • Two: http://blogs.msdn.com/dancre/archive/2006/02/13/531550.aspx
    • Three: http://blogs.msdn.com/dancre/archive/2006/02/14/532333.aspx
    • Four: http://blogs.msdn.com/dancre/archive/2006/02/16/implementing-a-virtualizingpanel-part-4-the-goods.aspx如果虚拟化网格还不够,请尝试移动到画布并手动强制某些宽度/高度/位置。删除自动布局有时会节省很多。然后,您可以使用虚拟画布如果你真的把固定大小的物品放在那里,你可能会尽快得到它。但这是最后的选择。前面提到的事情应该运作良好。

哦,关于虚拟化的最后一句话:记住,当 ScrollView 在虚拟化模式下工作时,然后Position不再以像素/点计算。在 v 模式下,滚动条的位置被计入items,也就是说,position=2.5 表示滚动位于第三个项目的中间(通过了 2 个项目,多了一半),而不是 pos=2.5“像素”。


旁注:“百万点画布”:https://blogs.msdn.microsoft.com/kaelr/2010/08/11/zoomableapplication2-a-million-items/

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

如何在WPF中绘制1216个画布元素而不挂应用程序 的相关文章

随机推荐

  • 谷歌加API:“权限不足”错误

    我正在使用 api 搜索 google plus 这是我的网址 https www googleapis com plus v1 activities query internet 20marketing access token xxxx
  • __name__ 的目的是什么?

    什么是 name 做 我只见过它搭配 main 没有别的 我知道经典if name main 定义作为包运行与独立运行时的行为 但是还有什么其他用途 name name is main 如果您直接执行脚本 如果您要导入模块 name 是模块
  • 如何正确重载 __add__ 方法?

    我需要写一门涉及日期的课程 我应该超载 运算符允许将天数添加到日期中 解释一下它是如何工作的 ADate对象表示为 2016 4 15 格式为 年 月 日 添加整数 10 应该得到 2016 4 25 这Date阶级有价值观self yea
  • .NET 集合类的渐近复杂度

    是否有任何关于 NET 集合类方法的渐近复杂性 big O 和其他 的资源 Dictionary
  • 如何控制 JSF 中的访问和权限?

    我想在用户登录我的系统后控制访问 例如 administrator can add delete and give rights to employee employee fill forms only 因此 在知道用户拥有哪些权限后 检查
  • 如何使用log4j的同一个记录器将不同的信息写入两个不同的文件?

    我想使用我的记录器写入两个不同的文件 其声明如下 public static final Logger logger Logger getLogger Adapt class PropertyConfigurator configure l
  • 在 Ajax 调用中传递包含空格的值

    尝试在 ajax 调用中传递空格 我相信 word 与 word 的传递方式相同 另一方面 两个单词需要通过呼叫完全发送 第二个词 但不一样 第二个字 我应该在调用之前修剪还是在服务器端脚本上执行此操作 我怎样才能发送空格 我知道这是一个老
  • urllib2/requests 和 HTTP 相对路径

    如何强制 urllib2 requests 模块使用相对路径而不是完整 绝对 URL 当我使用 urllib2 requests 发送请求时 我在代理中看到它将其解析为 GET https xxxx path to something HT
  • 为什么我的应用程序没有输入 if 语句

    我正在尝试用 Java 编写一个控制台客户端 服务器应用程序 使用套接字 我目前有一个简单的登录系统和一个简单的命令系统 登录系统似乎可以正常工作 尽管它会向客户端打印 无效的用户名和密码 行 无论用户是否输入正确的凭据 连接肯定有效 然而
  • GAE 部署 Java8/Java7 错误

    我正在尝试通过 Intellij IDEA 将一个基本上空的项目部署到 GAE 我创建了一个新项目 在 appengine web xml 中设置我的项目 ID 并保留其他所有内容 我收到以下错误 并带有完整日志here java lang
  • 在满足条件后使用 mufa 停止 React 组件之间的通信

    我正在使用 sub pub 模式mufa在 React 组件之间而不是 props 之间进行通信 然后 我们将减轻父组件中的逻辑 正如您将在下面的代码片段中注意到的那样 const on fire mufa class Input exte
  • 使用 codeigniter 电子邮件库时,当主题 > 75 个字符时,电子邮件主题标头格式错误

    当主题超过 75 个字符时 我的 MIME 标头中出现一些乱码 当换行符编码在标头中时 会有一个无效的额外换行符 某些电子邮件网关会使用以下内容退回电子邮件 MIME 字段格式错误 utf 8 Q SUBJECT error 有人有过使用
  • Gradle - 没有主要清单属性

    我正在使用 Gradle 构建 JAR 文件 当我尝试运行它时 出现以下错误 RxJavaDemo jar 中没有主要清单属性 我尝试操纵manifest属性 但我想我忘记添加依赖项或其他内容 我究竟做错了什么 apply plugin j
  • 如果失败X次,nodejs重试功能

    我希望我的函数执行 X 3 次直到成功 在我的情况下我正在跑步kinesis putRecord 来自 AWS API 如果失败 我想再次运行它 直到成功 但尝试次数不超过 3 次 我是 NodeJS 新手 我写的代码很难闻 const p
  • 从复合组件执行 JavaScript

    美好的一天 我有一个问题困扰了我几个小时 这非常简单 我尝试在呈现复合组件时调用 执行 JavaScript 就像您可以使用 html 标签 body 和 onload 执行的操作一样 如何引用要执行的内联 JavaScript
  • BufferedWriter 未将所有内容写入其输出文件

    我有一个 Java 程序 它从文件中逐行读取一些文本 并将新文本写入输出文件 但并不是我写给我的所有文字BufferedWriter程序完成后出现在输出文件中 这是为什么 详细信息 该程序获取 CSV 文本文档并将其转换为 SQL 命令以将
  • 想要创建一个简单的图像亮度控制滑块

    我想实现一个滑块控件来改变图像的亮度 就像这个链接中显示的那样 http camanjs com examples 我对 javascript 相当陌生 事实证明这相当困难 所以现在 我正在使用 CamanJS 库 但不幸的是无法复制它 我
  • 即使两个字符串 s1 和 s3 具有相同的哈希码,== 如何返回 false? [复制]

    这个问题在这里已经有答案了 public static void main String args String str1 java String str2 str1 intern String str3 new String str1 i
  • 如何在 Google App Engine 上读取 Excel 文件

    我正在寻找 python 库的 java 替代品 这是问题如何在 Google App Engine 上读取 Excel 文件 看看博客帖子 如何在GAE上生成Excel文件 它讨论了使用JExcelAPIGAE 中的库 JExcelAPI
  • 如何在WPF中绘制1216个画布元素而不挂应用程序

    我正在开发一个应用程序 我想添加一些很酷的图标 因为我使用的是漂亮的 MahApps 库 所以我想在 MahApps Metro MahApps Metro Resources Icons xaml 中对图标进行可视化 所以我做了一些字符串