Как удалить минимизацию и максимизацию из окна с изменяемыми размерами в WPF? - PullRequest
73 голосов
/ 04 декабря 2008

WPF не предоставляет возможности иметь окно, которое позволяет изменять размер, но не имеет кнопок максимизации или минимизации. Я бы хотел создать такое окно, чтобы у меня были диалоговые окна с изменяемым размером.

Я знаю, что решение будет означать использование pinvoke, но я не уверен, что звонить и как. Поиск по pinvoke.net не нашел ничего, что могло бы мне показаться нужным, в основном я уверен, потому что Windows Forms действительно предоставляет свойства CanMinimize и CanMaximize для своих окон.

Может ли кто-нибудь указать мне или предоставить код (предпочтительно на C #), как это сделать?

Ответы [ 7 ]

100 голосов
/ 04 декабря 2008

Я украл код, который нашел на форумах 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();
};

Надеюсь, это поможет!

80 голосов
/ 06 октября 2011

Один из способов - установить ResizeMode="NoResize". Это будет вести себя так. enter image description here

Надеюсь, это поможет!

19 голосов
/ 04 декабря 2008

image

Don't know if this works for your req. visually.. This is


5 голосов
/ 28 марта 2013

Если кто-либо использует окно 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;
    } 
}
3 голосов
/ 10 мая 2011

Вот решение, которое я использую. Обратите внимание, что кнопка максимизации по-прежнему отображается.

Markup:

<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;
}
2 голосов
/ 15 сентября 2010

Вы можете установить ResizeMode = "NoResize" окна, если хотите удалить кнопку "Свернуть и развернуть"

0 голосов
/ 18 октября 2018

Этот вариант решения , предложенного @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);
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...