为什么我的鼠标在WPF中的按钮上移动时会变得不稳定

时间:2012-05-24 11:45:21

标签: c# wpf

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

当我将鼠标移到按钮上时,热键会像你期望的那样发生,但是鼠标停顿的时间不到半秒,这不是一个大问题,但似乎有些不对劲。

编辑我想我从未真正问过一个问题。我想知道的是。这是正常行为,或者我是如何做到这一点的。

    //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 另一项测试我删除了“允许透明度”属性,并将背景设置为纯色,并且工作正常。因此问题与具有透明背景的最大化窗口有关。这有意义吗?

1 个答案:

答案 0 :(得分:1)

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

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

微软的Dwayne Need有一篇关于Transparent Windows in WPF的博文:

  

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

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