51

これはややありふれた質問ですが、WPFには組み込みの方法がないように思えます。最小化される前にウィンドウがまたは状態にWindowStateあったかどうかがわからないため、列挙型であることが役に立たないプロパティがあるようです。NormalMaximized

タスクバー アイコンをクリックすると、ウィンドウは以前の状態を想定して期待どおりに復元されますが、それを行う定義済みのメソッドが見つからないようです。

だから私は何かが欠けているだけなのか、それともカスタムの対話ロジックを使用する必要があるのか​​ 疑問に思っていました.

現在の解決策を回答として投稿します

4

7 に答える 7

94

これがすべての人に当てはまるかどうかはわかりませんが、今日私はこれに遭遇し、チームの誰かが「ノーマルを試しましたか?」と提案しました。

彼は正しかったことがわかりました。以下は、ウィンドウをうまく復元するようです:

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

これは問題なく機能し、必要に応じてウィンドウを最大化に戻します。WindowState.Normalをもう一度呼び出すと、ウィンドウが最大化されていない状態に「復元」されるため、最初に最小化された状態を確認することが重要です。

お役に立てれば。

于 2011-07-26T22:33:43.157 に答える
21

SystemCommandsクラスには、ウィンドウを以前の状態に復元するRestoreWindowという静的メソッドがあります。

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

[注: SystemCommandsクラスは、フレームワークの以前のバージョンを対象とするプロジェクトの .NET 4.5+ (MSDN Ref)の一部であり、WPF シェル拡張(MSDN Ref)を使用できます]

于 2015-07-25T11:17:16.583 に答える
15

WPF の観点では、これは OS の機能です。OS の機能をいじりたい場合は、手を汚さなければならない場合があります。幸いなことに、彼らはそのためのツールを提供してくれました。以下は、WPF ウィンドウを取り、WIN32 を使用して状態を記録せずに効果を達成する UN-minimize メソッドです。

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,
    }
}
于 2011-04-04T06:42:31.277 に答える
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;
于 2011-04-03T18:24:44.937 に答える
2

うーん、受け入れられた答えは私にはうまくいきませんでした。「最大化された」ウィンドウは、タスク バーから呼び出されると、画面の中央に配置され (状態が最大化されていても、通常のサイズで表示されます)、タイトル バーでウィンドウをドラッグするなどの操作が機能しなくなりました。最終的に(ほとんど試行錯誤によって)、私はそれを行う方法を見つけました。答えを導いてくれた@HBと@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;
}
于 2013-04-16T11:18:46.217 に答える
0

In native Windows you can restore your window to a previous state with ShowWindow(SW_RESTORE):

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.

There's surely .Net counterpart to that.

于 2011-04-03T18:32:58.387 に答える