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

时间:2015-08-19 04:12:25

标签: c# wpf xaml

我正在研究概念验证应用程序,以评估我们可能(或可能不)期望的性能,如果我们将主要产品移动到使用矢量图标而不是位图。到目前为止,除了一个主要问题外,结果非常令人鼓舞。当窗口从一个监视器移动到另一个监视器时,窗口接触一个屏幕的末端会有一个长时间冻结,然后开始显示在下一个监视器上。基本上,只要窗口以任何方式跨越两个监视器,它就会以非常缓慢和卡顿的方式移动。奇怪的是,只要它只在显示器上,一切都很好。拖动屏幕,调整大小,最小化和最大化,拖动停靠在任何一侧,都是快速和流畅的。

我正在创建的窗口上面有一个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。

1 个答案:

答案 0 :(得分:0)

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

如果有人能想到更好的东西,我会全神贯注......