IT TIP

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

itqueen 2020. 10. 22. 23:50
반응형

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


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

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

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


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

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


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

이게 도움이 되길 바란다!


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

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

누구든지 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;
    } 
}

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

마크 업 :

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

최소화 및 최대화 버튼을 제거하려면 창의 ResizeMode = "NoResize"를 설정할 수 있습니다.


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

참고 URL : https://stackoverflow.com/questions/339620/how-do-i-remove-minimize-and-maximize-from-a-resizable-window-in-wpf

반응형