WPF窗口在监视器之间拖动时冻结
本文关键字:拖动 冻结 之间 监视器 窗口 WPF | 更新日期: 2023-09-27 18:08:50
我正在开发一个概念验证应用程序,以评估如果我们将主要产品改为使用矢量图标而不是位图,我们可能(或可能不)期望的性能。到目前为止,结果非常令人鼓舞,除了一个主要问题。当窗口从一个显示器移动到另一个显示器时,当窗口接触到一个屏幕的末端时,在开始显示下一个屏幕之前,会有很长时间的冻结。基本上,只要窗口以任何方式跨越两个显示器,它就会以非常缓慢和口吃的方式移动。奇怪的是,只要它只是在显示器上,一切都很好。拖动屏幕,调整大小,最小化和最大化,拖动到任何一侧的停靠,所有这些都是快速和流畅的。
我正在创建的窗口上有一个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。我选择了垃圾桶图标,因为它具有合理的复杂性,并且使用了相当数量的渐变。我有RenderingOptions。CachingHint=设置在DrawingBrush上的"缓存"。我试着把刷子冻起来,但是没有效果。
窗口加载速度非常快,比使用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
无法解决这个问题,所以最终不得不实现一个类,将DrawingBrush缓存为ImageBrush,并更新sizechange。这不是一个理想的解决方案,但可以接受。
如果有人能想出更好的办法,我洗耳恭听…