我正在研究概念验证应用程序,以评估我们可能(或可能不)期望的性能,如果我们将主要产品移动到使用矢量图标而不是位图。到目前为止,除了一个主要问题外,结果非常令人鼓舞。当窗口从一个监视器移动到另一个监视器时,窗口接触一个屏幕的末端会有一个长时间冻结,然后开始显示在下一个监视器上。基本上,只要窗口以任何方式跨越两个监视器,它就会以非常缓慢和卡顿的方式移动。奇怪的是,只要它只在显示器上,一切都很好。拖动屏幕,调整大小,最小化和最大化,拖动停靠在任何一侧,都是快速和流畅的。
我正在创建的窗口上面有一个WrapPanel。在OnLoaded处理程序中,我按以下方式向面板添加元素
Brush brush = Application.Current.FindResource("ICO_Trashcan") as Brush;
for (int i = 0; i < 200; i++)
{
Rectangle rect = new Rectangle()
{
Width = 18,
Height = 18,
SnapsToDevicePixels = true,
Fill = brush
};
_wrapPanel.Children.Add(rect);
}
for (int i = 0; i < 200; i++)
{
Rectangle rect = new Rectangle()
{
Width = 32,
Height = 32,
SnapsToDevicePixels = true,
Fill = brush
};
_wrapPanel.Children.Add(rect);
}
for (int i = 0; i < 200; i++)
{
Rectangle rect = new Rectangle()
{
Width = 60,
Height = 60,
SnapsToDevicePixels = true,
Fill = brush
};
_wrapPanel.Children.Add(rect);
}
画笔资源是我从Xamalot.com下载的DrawingBrush。我选择了垃圾桶图标,因为它具有合理的复杂性并且使用了相当多的渐变。我在DrawingBrush上设置了RenderingOptions.CachingHint =“Cache”。我试着冷冻刷子,但没有区别。
窗口加载速度非常快,比使用PNG的等效代码快许多个数量级。我只是想不通为什么在显示器之间拖动是如此糟糕的经历。
有人有什么想法吗?感谢。
编辑:
窗口的XAML很小:
<Window x:Class="VectorIconEvaluation.VectorWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="Window_Loaded"
LocationChanged="Window_LocationChanged"
WindowStartupLocation="CenterScreen"
Background="#202020"
Title="VectorWindow" Height="1000" Width="1500">
<Grid UseLayoutRounding="True" SnapsToDevicePixels="True">
<WrapPanel x:Name="_wrapPanel"/>
</Grid>
这只是一个概念证明,因此MVVM的使用是无关紧要的。完整的应用程序确实使用MVVM。
答案 0 :(得分:0)
无法解决这个问题,因此最终必须实现一个将DrawingBrush缓存为ImageBrush的类,并更新SizeChanged。不是理想的解决方案,但可以接受。
如果有人能想到更好的东西,我会全神贯注......