我制作了一个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 另一项测试我删除了“允许透明度”属性,并将背景设置为纯色,并且工作正常。因此问题与具有透明背景的最大化窗口有关。这有意义吗?
答案 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必须切换到您的特定应用程序的软件渲染的结果。