WPF의 크기 조정 가능한 창에서 최소화 및 최대화를 제거하려면 어떻게합니까?


80

WPF는 크기를 조정할 수 있지만 최대화 또는 최소화 단추가없는 창을 제공하는 기능을 제공하지 않습니다. 크기 조정이 가능한 대화 상자를 가질 수 있도록 이러한 창을 만들고 싶습니다.

해결책이 pinvoke를 사용하는 것을 의미한다는 것을 알고 있지만 무엇을 어떻게 호출 해야할지 모르겠습니다. pinvoke.net을 검색해도 필자가 필요로하는 것으로 튀어 나온 것은 발견되지 않았습니다. 주로 Windows Forms가 창에 CanMinimizeCanMaximize속성을 제공하기 때문 입니다.

누군가 나를 가리키는 방법을 알려주거나 코드 (C # 선호)를 제공 할 수 있습니까?

답변:


114

MSDN 포럼에서 찾은 일부 코드를 훔쳐서 다음과 같이 Window 클래스에 확장 메서드를 만들었습니다.

internal static class WindowExtensions
{
    // from winuser.h
    private const int GWL_STYLE      = -16,
                      WS_MAXIMIZEBOX = 0x10000,
                      WS_MINIMIZEBOX = 0x20000;

    [DllImport("user32.dll")]
    extern private static int GetWindowLong(IntPtr hwnd, int index);

    [DllImport("user32.dll")]
    extern private static int SetWindowLong(IntPtr hwnd, int index, int value);

    internal static void HideMinimizeAndMaximizeButtons(this Window window)
    {
        IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(window).Handle;
        var currentStyle = GetWindowLong(hwnd, GWL_STYLE);

        SetWindowLong(hwnd, GWL_STYLE, (currentStyle & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX));
    }
}

기억해야 할 유일한 다른 점은 어떤 이유로 이것이 창의 생성자에서 작동하지 않는다는 것입니다. 나는 이것을 생성자에 넣음으로써 그 문제를 해결했습니다.

this.SourceInitialized += (x, y) =>
{
    this.HideMinimizeAndMaximizeButtons();
};

도움이 되었기를 바랍니다!


3
창에서 다소 예쁜 코드 : protected override void OnSourceInitialized (EventArgs e) {base.OnSourceInitialized (e); this.HideMinimizeAndMaximizeButtons (); }
Dmitry Shechtman

1
더 간단하게 만들고 HideMinimizeAndMaximizeButtons () 메서드에서 바로 SourceInitialized 이벤트를 구독하는 것은 어떻습니까? 그런 다음 생성자에서 메서드를 호출 할 수 있으며 다른 작업은 필요하지 않습니다.
jmatthias

1
이 솔루션은 제목 표시 줄의 두 번 클릭을 다루지 않습니다.
Lonli-Lokli 2011 년

1
부활 노트! 핸들이 Initialized 이벤트에 정의되어 있지 않으므로 메서드를 Windows Loaded 이벤트에 넣어야합니다.
SezMe

4
이 기능이 Windows Forms에 존재한다는 것을 알면서도 Microsoft가 처음부터 이러한 종류의 기능을 WPF에 넣지 않았다는 것을 이해하지 못합니다. 솔직히, 최소화 상자와 최대화 책이있는 대화 상자는 전문가답지 않게 보이며 캡션 표시 줄을 두 번 클릭하는 것은 동일한 문제입니다. WPF에 대한 실망감을 조금 환기시켜 죄송합니다. 매우 훌륭하고 문자열 자산이 있지만 가끔은 단순해야하지만 결국에는 그렇지 않은 것을 우연히 발견했습니다.
Philip Stuyck

92

한 가지 방법은 ResizeMode="NoResize". 이렇게 동작합니다. 여기에 이미지 설명 입력

이게 도움이 되길 바란다!


33
이로 인해 창 크기를 조정할 수 없으며 이는 질문과 직접적으로 반대됩니다.
Mashmagar

5
일반적으로 최소화 및 최대화 버튼을 비활성화하는 방법을 찾는 Google 직원은 창 크기를 조정할 수있는 특정 요구 사항이 없습니다. 현재 이것은 "wpf window disable minimal"쿼리의 최상위 결과이며이 답변은 질문에 올바르게 대답합니다. 그럼에도 불구하고 MS가 제목 표시 줄이나 전체 창 크롬을 "단지 다른 컨트롤 또는 속성"으로 만들지 않은 것은 부끄러운 일입니다. 90
Orionii 황제 12

2
이 경우 동적 너비가있는 요소 (예 : DockPanel)는 여전히 창 크기를 변경할 수 있습니다. 그러나 더 이상 사용자는 아닙니다. 따라서이 옵션은 실제로 내 요구 사항을 충족했습니다.
OneWorld

4
질문에 대답하지 않지만 도움이되었습니다. 감사.
dkantowitz 2013-06-12

@EmperorOrionii 당시에는이 페이지가 Google의 최상위 결과 였을 수 있지만 " resizable windowWPF 에서 최소화 및 최대화를 어떻게 제거 합니까?"를 다루지 않는다고 생각할 때이 답변이 최고임을 의미하지는 않습니다. 제거 할 때 "크기 조정" 완성 된 제품에서 측면을. 그것은 자동차를 붉게 칠하고 당신이 엔진을 제거하는 과정에서 누군가를 돕는 것과 같습니다.
MickyD 2011

22

이것이 귀하의 요구 사항에 맞는지 모르겠습니다. 시각적으로 .. 이것은

<Window x:Class="DataBinding.MyWindow" ...Title="MyWindow" Height="300" Width="300" 
    WindowStyle="ToolWindow" ResizeMode="CanResizeWithGrip">

3
거의 작동하지만 제목 표시 줄을 두 번 클릭하고 마우스 오른쪽 단추를 클릭 한 다음 제어 메뉴 또는 작업 표시 줄 단추를 사용하면 창을 최대화하거나 최소화 할 수 있습니다. 물론 일반 창이 아닌 도구 창처럼 보입니다.
Nidonocu

맞습니다 ...하지만 다시 IMHO 제약 조건은 사용자가 최대화 할 수 없지만 크기를 조정하여 수동으로 창을 끌어 확대 할 수 있다는 것이 이상합니다. 하지만 :) 규칙 .. 창문입니다
Gishu

이 기능은 창 MaxWidth및 / 또는 MaxHeight창이 설정된 상황에 유용 할 수 있습니다 .
Brett Ryan

6

누구든지 Devexpress 창 (DXWindow)을 사용하는 경우 수락 된 답변이 작동하지 않습니다. 한 가지 추악한 접근 방식은

public partial class MyAwesomeWindow : DXWindow
{
    public MyAwesomeWIndow()
    {
       Loaded += OnLoaded;
    }

    private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
    {
        // hides maximize button            
        Button button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_Maximize.ToString());
        button.IsHitTestVisible = false;
        button.Opacity = 0;

        // hides minimize button
        button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_Minimize.ToString());
        button.IsHitTestVisible = false;
        button.Opacity = 0;

        // hides close button
        button = (Button)DevExpress.Xpf.Core.Native.LayoutHelper.FindElementByName(this, DXWindow.ButtonParts.PART_CloseButton.ToString());
        button.IsHitTestVisible = false;
        button.Opacity = 0;
    } 
}

여기 아래에서 귀하의 답변을 발견하기 전에 아마도 다섯 개의 다른 게시물을 읽었을 것입니다. 이것은 작동하지만 엉망입니다. 더 나은 방법을 찾았습니까?
DonBoitnott

3

여기 내가 사용하고있는 해결책이 있습니다. 최대화 버튼은 계속 표시됩니다.

마크 업 :

<Window x:Class="Example"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Example"
        StateChanged="Window_StateChanged">

뒤에있는 코드 :

// Disable maximizing this window
private void Window_StateChanged(object sender, EventArgs e)
{
    if (this.WindowState == WindowState.Maximized)
        this.WindowState = WindowState.Normal;
}

1
그는 버튼을 숨기고 기능은 유지하는 방법을 물었습니다.
Alexandru Dicu 2013 년

최소한으로 창이 깜박입니다. 별로 좋지 않습니다.
Mugen


0

@MattHamilton이 제안한솔루션의 변형은 Window의 생성자에서 호출 될 수 있으며 반드시 호출되어야합니다. 트릭은 SourceInitialized확장 메서드 내에서 이벤트에 대리자를 구독하는 것입니다.

private const int GWL_STYLE = -16, WS_MAXIMIZEBOX = 0x10000, WS_MINIMIZEBOX = 0x20000;

[DllImport("user32.dll")]
extern private static int GetWindowLong(IntPtr hwnd, int index);

[DllImport("user32.dll")]
extern private static int SetWindowLong(IntPtr hwnd, int index, int value);

/// <summary>
/// Hides the Minimize and Maximize buttons in a Window. Must be called in the constructor.
/// </summary>
/// <param name="window">The Window whose Minimize/Maximize buttons will be hidden.</param>
public static void HideMinimizeAndMaximizeButtons(this Window window)
{
    window.SourceInitialized += (s, e) => {
        IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(window).Handle;
        int currentStyle = GetWindowLong(hwnd, GWL_STYLE);

        SetWindowLong(hwnd, GWL_STYLE, currentStyle & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);
    };
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.