prosource

코드백에서 최소화된 창을 복원하는 방법은 무엇입니까?

probook 2023. 4. 28. 21:08
반응형

코드백에서 최소화된 창을 복원하는 방법은 무엇입니까?

이것은 다소 일상적인 질문이지만 WPF에는 그것을 위한 내장된 방법이 없는 것처럼 보입니다.오직 있는 것처럼 보입니다.WindowState윈도우가 있었는지 알 수 없기 때문에 열거형이 되는 속성은 도움이 되지 않습니다.Normal또는Maximized최소화하기 전의 상태.

작업 표시줄 아이콘을 클릭하면 창이 이전 상태를 가정하여 예상대로 복원되지만 정의된 방법을 찾을 수 없습니다.

그래서 저는 제가 단지 무언가를 놓치고 있는 것인지 아니면 사용자 지정 상호 작용 논리를 사용해야 하는지 궁금합니다.

(현재 솔루션을 답변으로 게시합니다.)

이것이 모두에게 효과가 있을지는 확실하지 않지만, 오늘 우연히 이것을 만났고 팀의 누군가가 "일반적으로 시도 보셨습니까?"라고 제안했습니다.

그가 옳았다는 것이 밝혀졌습니다.다음은 창을 올바르게 복원하는 것 같습니다.

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

필요한 경우 창을 Maximized(최대화)로 복원하는 것이 좋습니다.WindowState를 호출할 때 먼저 최소화된 상태를 확인하는 것이 중요한 것 같습니다. 번째 정상적인 경우 창이 최대화되지 않은 상태로 "복원"됩니다.

System Commands 클래스에는 창을 이전 상태로 복원하는 RestoreWindow라는 정적 메서드가 있습니다.

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

[참고: System Commands 클래스는 의 일부입니다.이전 버전의 Framework를 대상으로 하는 프로젝트의 경우 NET 4.5+(MSDN Ref)는 WPF Shell Extension(MSDN Ref)을 사용할 수 있습니다.]

WPF의 관점은 이것이 OS 기능이라는 것입니다.OS 기능을 만지작거리려면 손을 더럽혀야 할 수도 있습니다.다행히도 그들은 우리에게 그렇게 할 수 있는 도구를 제공했습니다.다음은 WPF 창을 사용하고 WIN32를 사용하여 상태를 기록하지 않고 효과를 달성하는 UN 최소화 방법입니다.

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,
    }
}

웬일인지 그래.

WindowState = WindowState.Normal;

나한텐 안 통했어요그래서 저는 다음 코드를 사용했고 그것은 작동했습니다.

 Show();
 WindowState = WindowState.Normal;

지금 바로 복원할 수 있는 방법은 다음과 같습니다.제가 처리합니다.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;

흠, 수락된 답변은 저에게 효과가 없었습니다.작업 표시줄에서 호출할 때 "최대화" 창은 화면의 중심을 맞추게 되고(상태가 최대화됨에도 불구하고 일반 크기로 표시됨) 제목 표시줄로 창을 끌면 작동하지 않게 됩니다.결국 (시행착오를 겪으면서) 어떻게 해야 할지 알게 되었습니다.to @H.B. an d @에릭 리프란디가 답을 알려주셔서 감사합니다!코드는 다음과 같습니다.

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;
}

기본 Windows에서는 다음을 사용하여 창을 이전 상태로 복원할 수 있습니다.ShowWindow(SW_RESTORE):

창을 활성화하고 표시합니다.창이 최소화되거나 최대화되면 시스템이 창을 원래 크기와 위치로 복원합니다.최소화된 창을 복원할 때 응용 프로그램에서 이 플래그를 지정해야 합니다.

확실히 있습니다.그것에 대한 순 대응물.

언급URL : https://stackoverflow.com/questions/5531548/how-to-restore-a-minimized-window-in-code-behind

반응형