2012-05-24 35 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。但它肯定有可能進入軟件模式。我將避免讓我的主窗口透明,這將解決我的問題,謝謝 –

相關問題