2011-04-03 57 views
36

這是一個平凡的問題,但在我看來,在WPF中沒有內置的方法。似乎只有WindowState財產這是一個枚舉沒有幫助,因爲我不知道該窗口是否在最小化之前處於NormalMaximized狀態。如何在代碼隱藏中恢復最小化窗口?

當單擊任務欄圖標時,正如預期的那樣恢復窗口,假設它的在前狀態,但我似乎無法找到任何定義的方法。

所以我一直想知道如果我只是缺少的東西或如果我需要使用一些自定義的交互邏輯。

我會後我目前的解決方案,答案

+0

你叫this.Show()?或者你正在改變狀態? – 2011-04-03 18:53:59

+0

@Akash Kava'Window.Show'隻影響可見性,它對窗口的狀態沒有影響。最小化是一個國家問題。 – 2011-04-03 19:36:01

+0

好吧,我檢查反射器調用Show()確實調用ShowWindow API作爲別人提到的,我想知道你是否嘗試過this.Show()?因爲我用過它,可能我沒有注意到。 – 2011-04-04 07:53:08

回答

70

不知道這會爲大家工作,但我遇到了這個今天someone對球隊建議「你試過正常」?

原來他是對的。以下似乎很好地恢復您的窗口:

if (myWindow.WindowState == WindowState.Minimized) 
    myWindow.WindowState = WindowState.Normal; 

這很好,恢復窗口最大化,如果需要。看起來至關重要的是首先檢查最小化狀態,因爲第二次調用WindowState.Normal會將窗口「恢復」到其非最大化狀態。

希望這會有所幫助。

+12

我甚至沒有... – 2011-07-26 22:59:24

+2

對H.B.的類似情緒。花了十分鐘,想知道如何在這裏磕磕絆絆,看到它是自動的。 – aggieNick02 2013-04-12 20:33:53

3

這是我如何得到它現在就恢復:我處理StateChanged事件跟蹤,這不是Minimized

最後狀態的
WindowState _lastNonMinimizedState = WindowState.Maximized; 
private void Window_StateChanged(object sender, EventArgs e) 
{ 
    if (this.WindowState != System.Windows.WindowState.Minimized) 
    { 
     _lastNonMinimizedState = WindowState; 
    } 
} 

要恢復的話,我必須分別設置該WindowState

this.WindowState = _lastNonMinimizedState; 
0

在本機窗口中,您可以將窗口恢復到之前的狀態ShowWindow (SW_RESTORE)

激活並顯示窗口。如果窗口被最小化或最大化,則系統將其恢復到其原始大小和位置。應用程序應該在恢復最小化窗口時指定此標誌。

確實與.Net相對應。

14

WPF的觀點是,這是一個操作系統功能。如果你想搞亂操作系統的功能,你可能不得不弄髒你的手。幸運的是,他們爲我們提供了這樣做的工具。這裏是聯合國最小化的方法,需要一個WPF窗口,並使用WIN32完成的效果,不記錄任何狀態:

public static class Win32 
{ 
    public static void Unminimize(Window window) 
    { 
     var hwnd = (HwndSource.FromVisual(window) as HwndSource).Handle; 
     ShowWindow(hwnd, ShowWindowCommands.Restore); 
    } 

    [DllImport("user32.dll")] 
    private static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow); 

    private enum ShowWindowCommands : int 
    { 
     /// <summary> 
     /// Activates and displays the window. If the window is minimized or 
     /// maximized, the system restores it to its original size and position. 
     /// An application should specify this flag when restoring a minimized window. 
     /// </summary> 
     Restore = 9, 
    } 
} 
+0

謝謝你的回答。我幾乎從來沒有使用過外部調用,所以我想知道,有沒有辦法導入完整的'ShowWindowCommands'枚舉? – 2011-04-04 11:31:34

+0

@ H.B。該網站pinvoke.net有完整的枚舉;我只是颳了我們需要的一條線。你可以谷歌「pinvoke _win32api_」例如「pinvoke ShowWindow」查找要剪切和粘貼的代碼。 ShowWindowCommands的其餘部分在http://pinvoke.net/default.aspx/Enums/ShowWindowCommand.html – 2011-04-04 16:18:40

+0

再次感謝(我不知道枚舉的部分定義就足夠了) – 2011-04-04 16:40:37

1

嗯,接受的答案不適合我。從任務欄中調出的「最大化」窗口最終會在屏幕上自動居中(以正常大小顯示,即使其狀態爲「最大化」),並且通過標題欄拖動窗口等操作最終不起作用。最後(幾乎是通過試驗和錯誤),我想出瞭如何做到這一點。感謝@ H.B。和@Eric Liprandi引導我回答問題!代碼如下:

private bool windowIsMinimized = false; 
private WindowState lastNonMinimizedState = WindowState.Normal; 

private void Window_StateChanged(object sender, EventArgs e) 
{ 
    if (this.windowIsMinimized) 
    { 
     this.windowIsMinimized = false; 
     this.WindowState = WindowState.Normal; 
     this.WindowState = this.lastNonMinimizedState; 
    } 
    else if (this.WindowState == WindowState.Minimized) 
    { 
     this.windowIsMinimized = true; 
    } 
} 

private void Window_MinimizeButtonClicked(object sender, MouseButtonEventArgs e) 
{ 
    this.lastNonMinimizedState = this.WindowState; 
    this.WindowState = WindowState.Minimized; 
    this.windowIsMinimized = true; 
} 

private void Window_MaximizeRestoreButtonClicked(object sender, MouseButtonEventArgs e) 
{ 
    if (this.WindowState == WindowState.Normal) 
    { 
     this.WindowState = WindowState.Maximized; 
    } 
    else 
    { 
     this.WindowState = WindowState.Normal; 
    } 

    this.lastNonMinimizedState = this.WindowState; 
} 
9

SystemCommands類有一個叫做RestoreWindow,恢復窗口到以前的狀態靜態方法。

SystemCommands.RestoreWindow(this); // this being the current window 

[注:SystemCommands類是針對於早期版本的框架可以使用WPF外殼擴展(MSDN Ref)項目的.NET 4.5+ (MSDN Ref)部分]

+1

+1當用'TrayIcon'使用'ShowInTaskbar ='False''並將'可見性改爲隱藏'時,恢復窗口回到正常狀態有問題。但是,這很好。 – slavoo 2016-04-06 07:08:36

1

出於某種原因,

WindowState = WindowState.Normal; 

對我不起作用。 所以我用下面的代碼&它的工作..

Show(); 
WindowState = WindowState.Normal; 
相關問題