2012-05-24 37 views
0

我制作了一个WPF应用程序,带有一个窗口一个Grid和一个按钮。在SizeChanged事件窗口中,我使用scaleTransform我的Grid来最大化它的大小,但保持高宽比。为什么我的鼠标在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另一个测试我删除了允许透明属性,并将背景设置为纯色,并且它工作正常。所以这个问题与透明背景的Maximized窗口有关。这有意义吗?

+0

你能澄清一下吗?当我移动按钮的鼠标时,热卷会像你期望的那样发生?另外,你如何调整最大化的窗口? –

+0

我在初始调整大小后没有调整大小,我这样做的原因是它会匹配用户屏幕。我的意思是说,只要我在按钮上移动鼠标......不知道为什么我没有先说这个,现在编辑。 –

+0

不过,我不明白你在做什么以及如何将鼠标移动到仅包含点击处理程序和包含窗口大小更改处理程序的按钮上方,这会使鼠标“失速”。当鼠标移动到按钮上时,没有显示任何代码。无论如何,你的第三个编辑似乎包含答案。 –

回答

1

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

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

德韦恩微软需要有一个博客帖子大约Transparent Windows in WPF

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

您的经验可能是您的计算机没有修复程序(但包含在SP3中)或WPF不得不切换到您的特定应用程序的软件渲染的结果。

+0

我将此标记为答案,这可能是原因。我在一台工作网络计算机上,我确实有能力更新我的系统。我使用SP3运行Windows XP Professional。但它肯定有可能进入软件模式。我将避免让我的主窗口透明,这将解决我的问题,谢谢 –

相关问题