wpf 如何从可调整大小的窗口中删除最小化和最大化按钮?

sy5wg1nm  于 2022-12-27  发布在  其他
关注(0)|答案(8)|浏览(406)

WPF不提供允许调整大小但没有最大化或最小化按钮的窗口的功能。我希望能够制作这样一个窗口,这样我就可以调整对话框的大小。
我知道解决方案将意味着使用pinvoke,但我不确定调用什么以及如何调用。搜索pinvoke.net没有找到任何我需要的东西,主要是我可以肯定,因为Windows窗体确实在其窗口上提供了CanMinimizeCanMaximize属性。
有人能告诉我或提供代码(C#首选)如何做到这一点吗?

ogq8wdun

ogq8wdun1#

我偷了一些在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();
};
axr492tv

axr492tv2#

一种方法是设置你的ResizeMode="NoResize"。它的行为如下。

u59ebvdq

u59ebvdq3#

不知道这是否符合您的要求。视觉上..这是

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

insrf1ej4#

如果任何人使用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;
    } 
}
q1qsirdb

q1qsirdb5#

这是我正在使用的一个解决方案。注意,最大化按钮仍然显示。
加价:

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

xjreopfe6#

solution proposed的@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);
    };
}
dzhpxtsq

dzhpxtsq7#

如果您想删除最小化和最大化按钮,可以设置窗口的ResizeMode=“NoResize

kcrjzv8t

kcrjzv8t8#

就用

WindowStyle="ToolWindow"

它隐藏了最大化和最小化按钮,但是仍然可以通过拖动窗口边框来调整窗口大小,并使用任务栏右下角的隐藏按钮来最小化窗口。
https://learn.microsoft.com/en-us/dotnet/api/system.windows.window.windowstyle?view=windowsdesktop-6.0

相关问题