it-swarm.com.de

Wie entferne ich die Minimierung und Maximierung aus einem Fenster, das in der Größe verändert werden kann, in WPF?

WPF bietet nicht die Möglichkeit, ein Fenster zu haben, in dem die Größe geändert werden kann, jedoch keine Schaltflächen zum Maximieren oder Minimieren. Ich möchte in der Lage sein, ein solches Fenster zu erstellen, damit ich die Dialogfelder skalieren kann.

Ich bin mir bewusst, dass die Lösung Pinvoke verwenden wird, aber ich bin nicht sicher, was ich anrufen soll und wie. Bei der Suche nach pinvoke.net wurde nichts gefunden, was mir als das herauskam, was ich brauchte. Hauptsächlich bin ich sicher, da Windows Forms die Eigenschaften CanMinimize und CanMaximize in seinen Fenstern bietet.

Könnte jemand mich darauf hinweisen oder Code (C # bevorzugt) bereitstellen, wie dies zu tun ist?

72
Nidonocu

Ich habe Code gestohlen, den ich in den MSDN-Foren gefunden habe, und eine Erweiterungsmethode für die Window-Klasse erstellt.

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

Die einzige andere Sache, die Sie beachten sollten, ist, dass dies aus irgendeinem Grund nicht vom Konstruktor eines Fensters aus funktioniert. Ich bin damit umgekommen, indem ich das in den Konstruktor gesteckt habe:

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

Hoffe das hilft!

100
Matt Hamilton

Eine Möglichkeit ist, Ihren ResizeMode="NoResize" einzustellen. Es wird sich so verhalten .enter image description here

Ich hoffe das hilft!

77
Musikero31

 

Weiß nicht, ob dies für Ihre Anforderung funktioniert. visuell .. Das ist 

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

Wenn jemand das Devexpress-Fenster (DXWindow) verwendet, funktioniert die akzeptierte Antwort nicht. Ein hässlicher Ansatz ist 

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

Hier ist eine Lösung, die ich verwende. Beachten Sie, dass die Maximierungsschaltfläche weiterhin angezeigt wird.

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">

Code hinter:

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

Sie können ResizeMode = "NoResize" des Fensters festlegen, wenn Sie die Minimize and Maximize-Schaltfläche entfernen möchten

1
Chinmay Behera

Diese Variante der -Lösung von @MattHamilton kann (und muss) im Konstruktor des Fensters aufgerufen werden. Der Trick besteht darin, einen Delegaten für das Ereignis SourceInitialized innerhalb der Erweiterungsmethode zu abonnieren.

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