0

我制作了一个 WPF 应用程序,带有一个窗口、一个网格和一个按钮。在窗口 SizeChanged 事件中,我 scaleTransform 我的 Grid 以最大化它的大小但保持纵横比。

每当我将鼠标移到按钮上时,热轨就会如您所料发生,但鼠标停顿不到半秒钟,这不是一个大问题,但似乎有些不对劲。

编辑 我想我从来没有真正问过问题。我想知道的是。这是正常行为,还是我这样做有什么问题。

    //Store the initial size of the Grid
    double GridStartWidth;
    double GridStartHeight;

    public MainWindow()
    {
        InitializeComponent();
        //Get the values for the initial size of Grid
        GridStartWidth = MainGrid.Width;
        GridStartHeight = MainGrid.Height;
    }


    private void myMainWindow_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        double min = Math.Min(this.Height / GridStartHeight, this.Width / GridStartWidth);
        Transform tr = new ScaleTransform(min, min, .5, .5);
        MainGrid.LayoutTransform = tr;
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        Application.Current.Shutdown();
    }

不确定您是否需要 Xaml,但在这里

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" 
Name="myMainWindow"
Width="1280" Height="1024" SizeChanged="myMainWindow_SizeChanged" AllowsTransparency="True" Background="#4FFFFFFF" WindowStyle="None" WindowState="Maximized">
<Grid Name="MainGrid"  Background="#FF8DC78D" Width="800" Height="600">

    <Button Content="Exit" Height="23" HorizontalAlignment="Left" Margin="13,12,0,0" Name="ExitButton" VerticalAlignment="Top" Width="75" Click="button1_Click" />
</Grid>

编辑#2我只是尝试从头开始复制这个问题,并在添加功能时逐步测试它。当我将窗口状态设置为最大化时会出现问题。

编辑#3另一个测试我删除了 Allow Transparency 属性,并将背景设置为纯色,它工作正常。所以问题与具有透明背景的最大化窗口有关。这有意义吗?

4

1 回答 1

1

在 Windows 中更新屏幕上的鼠标指针具有很高的优先级,鼠标抖动或卡顿是驱动程序问题或严重性能问题的结果。

WPF 在 Windows XP 上可用,但硬件加速并不总是可用,从而导致性能问题。特别是存在影响透明窗口(您使用的)的问题。

Microsoft 的 Dwayne Need 有一篇关于WPF 中的透明窗口的博客文章:

DirectX 确实提供了IDirect3DSurface9::GetDC方法,该方法可以返回引用 DirectX 表面的 DC。不幸的是,如果在包含 alpha 通道的表面上调用此方法,则 DX9c 中有一个限制,该方法将失败。当然,我们分层窗口 API 的全部意义在于启用每像素透明度。Vista 取消了此限制,但我们的初始版本强制 WPF 使用其软件渲染回退并渲染到 XP 上的分层窗口。我们也能够解除 XP 的这一限制,我们将其作为热修复(KB 937106) 发布。这个热修复也包含在 XP SP3 中,所以去获取吧!现在,在 XP 上,我们可以通过 DirectX 进行渲染,并将 IDirect3DSurface9::GetDC 的结果直接传递给 UpdateLayeredWindow。在良好的视频驱动程序上,生成的副本将完全保留在视频卡上,从而获得出色的性能。但是,某些视频驱动程序可能会选择通过系统内存执行此复制。此类系统上的性能不会那么好,但对于许多场景来说仍然应该是合理的。

您的体验可能是由于您的计算机上没有热修复程序(但它包含在 SP3 中),或者是 WPF 必须为您的特定应用程序切换到软件呈现的结果。

于 2012-05-24T13:06:19.537 回答