为什么我的鼠标在 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另一个测试 我删除了"允许透明度"属性,并将背景设置为纯色,它工作正常。 因此,问题与具有透明背景的最大化窗口有关。 这有意义吗?
在 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 必须切换到特定应用程序的软件呈现的结果。