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

WPF窗口在监视器之间拖动时冻结

无法解决这个问题,所以最终不得不实现一个类,将DrawingBrush缓存为ImageBrush,并更新sizechange。这不是一个理想的解决方案,但可以接受。

如果有人能想出更好的办法,我洗耳恭听…