为什么我的鼠标在 WPF 中的按钮上移动时会断断续续

本文关键字:移动 断断续续 按钮 鼠标 我的 WPF 为什么 | 更新日期: 2023-09-27 18:35:23

我做了一个WPF应用程序,有一个窗口,一个网格和一个按钮。 在窗口中 大小更改 事件中,我缩放转换我的网格以最大化其大小,但保持纵横比。

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

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

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

为什么我的鼠标在 WPF 中的按钮上移动时会断断续续

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

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

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

DirectX

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

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