programing

크기 조정 가능한 창에서 버튼을 최소화하고 최대화하는 방법

newstyles 2023. 4. 9. 21:14

크기 조정 가능한 창에서 버튼을 최소화하고 최대화하는 방법

WPF에는 크기를 조정할 수 있는 창은 없지만 최대 또는 최소 버튼은 없습니다.크기를 조정할 수 있는 대화 상자를 만들 수 있는 창을 만들고 싶습니다.

해결방법은 pinvoke를 사용하는 것을 의미한다는 것은 알지만 무엇을 어떻게 불러야 할지 잘 모르겠습니다.pinvoke.net을 검색해도 필요한 것은 아무것도 나오지 않았습니다.Windows Forms는 다음 기능을 제공하고 있기 때문에CanMinimize그리고.CanMaximize속성을 표시합니다.

이 방법을 알려주시거나 코드(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 window(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;
}

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

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

그냥 사용하다

WindowStyle="ToolWindow"

최대 및 최소화 버튼은 숨겨지지만 창 테두리를 드래그하여 크기를 조정할 수 있으며 태스크바의 오른쪽 하단에 있는 숨기기 버튼을 사용하여 최소화할 수 있습니다.

https://learn.microsoft.com/en-us/dotnet/api/system.windows.window.windowstyle?view=windowsdesktop-6.0

언급URL : https://stackoverflow.com/questions/339620/how-to-remove-minimize-and-maximize-buttons-from-a-resizable-window