web-dev-qa-db-ja.com

コードビハインドで最小化されたウィンドウを復元する方法は?

これはありふれた質問ですが、WPFには組み込みのメソッドがないように思えます。最小化される前にウィンドウがWindowStateNormalのどちらの状態であったのかわからないため、列挙型であっても役に立たないMaximizedプロパティがあるようです。

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

だから私は何かが足りないのか、カスタムの相互作用ロジックを使用する必要があるのか​​疑問に思っていました。

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

43
H.B.

これがすべての人にとってうまくいくかどうかはわかりませんが、私は今日これに遭遇し、- someone チームは「あなたが試したNormal "?

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

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

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

お役に立てれば。

81
Eric Liprandi

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,
    }
}
15
Rick Sladkey

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

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

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

12
kiran

何らかの理由で、

WindowState = WindowState.Normal;

うまくいきませんでした。だから私は次のコードを使用しましたが、うまくいきました。

 Show();
 WindowState = WindowState.Normal;
5
Dark Knight

これが今すぐ復元する方法です: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;
3
H.B.

うーん、受け入れられた答えは私にはうまくいきませんでした。 「最大化された」ウィンドウは、タスクバーから呼び出されると、画面の中央に表示され(状態が最大化されていても通常のサイズで表示されます)、タイトルバーでウィンドウをドラッグするなどの動作が行われません。結局(かなりの試行錯誤で)、私はそれを行う方法を見つけました。 @ 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;
}
1
Heliac

ネイティブWindowsでは、ShowWindow(SW_RESTORE)を使用してウィンドウを以前の状態に復元できます。

ウィンドウをアクティブにして表示します。ウィンドウが最小化または最大化されている場合、システムはウィンドウを元のサイズと位置に戻します。アプリケーションは、最小化されたウィンドウを復元するときにこのフラグを指定する必要があります。

確かにそれに対応する.Net対応があります。

0
Alexey Ivanov