Як видалити мінімізувати та розгорнути з вікна, що змінюється у розмірі, у WPF?


80

WPF не надає можливості мати вікно, яке дозволяє змінювати розмір, але не має кнопок розгортання або зведення. Я хотів би мати можливість створити таке вікно, щоб мати діалогові вікна, які можна змінити.

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

Хтось міг би мені вказати або надати код (бажано на C #), як це зробити?

Відповіді:


113

Я викрав код, який знайшов на форумах 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
Дещо гарніший код у Вікні: захищений перевизначення void OnSourceInitialized (EventArgs e) {base.OnSourceInitialized (e); this.HideMinimizeAndMaximizeButtons (); }
Дмитро Шехтман

1
Чому б не зробити це ще простішим і не підписатись на подію SourceInitialized прямо в методі HideMinimizeAndMaximizeButtons ()? Тоді ви можете викликати метод з конструктора і не потрібно ні до чого іншого.
jmatthias

1
це рішення не охоплює подвійне клацання на рядку заголовка.
Лонлі-Локлі

1
Примітка про воскресіння! Метод повинен бути поміщений у подію, завантажену Windows, оскільки дескриптор не визначений у ініціалізованій події.
SezMe

4
Після всього цього часу, знаючи, що ця функціональність присутня у формах Windows, я просто не розумію, що Microsoft не включила такий тип функцій у WPF з самого початку. Відверто кажучи, діалогове вікно з мінімізацією та книгою, що розгортає, виглядає непрофесійно, і подвійне клацання на панелі субтитрів - це саме те саме. Вибачте, трохи провівши своє розчарування з приводу WPF, це дуже добре і має рядкові активи, але раз у раз ви натрапляєте на щось, що повинно бути простим, а зрештою - ні.
Філіп Стейк,

91

Один із способів - встановити свій ResizeMode="NoResize". Він буде поводитися так. введіть тут опис зображення

Сподіваюся, це допоможе!


32
Це зробило б вікно неможливим для зміни розміру, що прямо суперечить питанню.
Машмагар,

5
Як правило, у користувачів Google, які шукають спосіб відключити кнопки мінімізації та розгортання, немає особливих вимог щодо розміру вікна. На даний момент це найкращий результат для запиту "wpf window disable minimize", і ця відповідь правильно відповідає на питання. Незважаючи на це, соромно, що MS не зробила рядок заголовка чи хром цілого вікна "просто черговим елементом управління чи властивістю". Занадто багато спадщини від 90-х ...
Імператор Оріоній,

2
У цьому випадку елементи з динамічною шириною (наприклад, DockPanel) все ще можуть змінювати розмір вікна. Але вже не користувач. Отже, цей варіант насправді відповідав моїм вимогам.
OneWorld

3
Не відповідає на запитання, але мені було корисно. Дякую.
dkantowitz

@EmperorOrionii, хоча на той час ця сторінка могла бути найкращим результатом Google, жодним чином це не означає, що ця відповідь найкраща, якщо ви вважаєте, що вона не стосується "Як видалити мінімізацію та максимізацію з resizable windowфайлу WPF?" коли він знімає з «змінним» аспектом з готового продукту. Це все одно, що допомогти тому, хто хоче пофарбувати свою машину в червоний, а в процесі ви знімаєте двигун.
MickyD

22

Не знаю, чи це працює для вашого запиту. візуально .. Це

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

3
Це майже працює, але все ще можливо збільшити або згорнути вікно, якщо двічі клацнути рядок заголовка, клацнути правою кнопкою миші та скористатися меню керування або кнопкою панелі завдань, якщо вона доступна. Плюс, звичайно, це схоже на вікно інструменту, а не на звичайне.
Нідоноку

Правильно ... але знову ж таки IMHO обмеження здається дивним, що користувачеві не дозволяється розгортати, але він може вручну перетягувати-збільшувати вікно, змінюючи розмір. Але це ваше вікно .. ваші правила :)
Гішу,

це може бути корисним для ситуацій, коли встановлено вікно MaxWidthта / або MaxHeightвікно.
Бретт Райан,

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
Він запитав, як приховати кнопки, але зберегти функціональність.
Александру Діку

Як би це не було мінімально, вікно мерехтить. Не так приємно.
Mugen

2

Ви можете встановити ResizeMode = "NoResize" вікна, якщо ви хочете видалити кнопку Згорнути та Згорнути


Ех, але тоді ви не можете змінити розмір, він повинен мати можливість
Карстен

0

Цей варіант рішення, запропонований @MattHamilton, можна (і потрібно) викликати в конструкторі Вікна. Фокус полягає в тому, щоб передплатити делегата 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);
    };
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.