2011-06-28 24 views
1

我正在編寫一個既是GDI又是WPF的示例應用程序。我有一個WPF窗口,它有一個按鈕,帶有以下主體的點擊處理程序:關閉Vista/Windows 7時WPF窗口不會消失

this.DialogResult = true; 

這會關閉WPF對話框。但是,關閉此對話框時,Windows 7/Vista上不會出現「淡入淡出」效果。或者,使用GDI窗口,淡入淡出效果。我要麼做錯了什麼,或者這是關閉WPF窗口時的默認行爲。此外,使用X按鈕關閉執行相同的不需要的行爲。

理想情況下,我希望這兩種類型的窗戶都以相同的風格關閉。有人遇到過這種情況麼?這是否容易修復我的WPF窗口的全部

編輯:好的,所以我發現了一些非常有趣的東西。當父窗口關閉的窗口是而不是(例如,它移動到不同的顯示器)並關閉時,通常的淡入淡出會正確啓動!但是,如果要關閉的窗口位於父窗口之上,則不會出現淡化。可愛!

回答

0

我想出了一個解決方案,但我認爲它仍然相當黑客實際上已經淡出工作。我還用純WPF應用程序進行了測試,並且窗口仍然只會在而不是與其父窗口重疊時消失。如果有人比下面的代碼有更好的解決方案,請讓我知道!

public class WindowBase : Window 
{ 
    private bool hasFadeCompleted = false; 

    protected override void OnClosing(CancelEventArgs e) 
    { 
     if (this.hasFadeCompleted) 
     { 
      base.OnClosing(e); 
      return; 
     } 

     e.Cancel = true; 

     var hWnd = new WindowInteropHelper(this).Handle; 
     User32.AnimateWindow(hWnd, 1, AnimateWindowFlags.AW_BLEND | AnimateWindowFlags.AW_HIDE); 

     Task.Factory.StartNew(() => 
     { 
      this.Dispatcher.Invoke(new Action(() => 
      { 
       this.hasFadeCompleted = true; 
       this.Close(); 
      }), DispatcherPriority.Normal); 
     }); 
    } 
} 

public static class User32 
{ 
    [DllImport("user32.dll")] 
    public static extern bool AnimateWindow(IntPtr hWnd, int time, uint flags); 
} 

public static class AnimateWindowFlags 
{ 
    public const uint AW_HOR_POSITIVE = 0x00000001; 
    public const uint AW_HOR_NEGATIVE = 0x00000002; 
    public const uint AW_VER_POSITIVE = 0x00000004; 
    public const uint AW_VER_NEGATIVE = 0x00000008; 
    public const uint AW_CENTER = 0x00000010; 
    public const uint AW_HIDE = 0x00010000; 
    public const uint AW_ACTIVATE = 0x00020000; 
    public const uint AW_SLIDE = 0x00040000; 
    public const uint AW_BLEND = 0x00080000; 
} 

我還是很驚訝,這對其他人來說不成問題。

0

如果窗口是無國界的,

<Window 
    xmlns="blahblahblah" 
    AllowsTransparency="True" WindowStyle="None"> 

你可能可以逃脫製作的動畫漸變透明,並寫了密切的事件處理程序調用,然後在動畫完成關閉。如果窗口有邊框,我很確定邊框會留在那裏,看起來會更粗糙。

+0

感謝您的輸入。但是,窗口不是無邊界的。這只是一個標準的單邊界窗口。如果你創建一個新的WPF應用程序,這種行爲對你而言是否一樣? – TheCloudlessSky

+0

那麼窗口類默認爲該標準邊框,所以是的。但我有幾個應用程序和窗口,我做了無邊界。最特別的是,我的幫助>關於窗口。我喜歡使它們成爲無邊界和非矩形。如果我今天晚些時候得到時間,我可以嘗試一個動畫。現在他們就像平常一樣消失。 – CodeWarrior

+0

查看我更新的OP,瞭解有關該問題的更多詳細信息。如果您有時間,請嘗試重現問題。我讚賞你的洞察力! – TheCloudlessSky