web-dev-qa-db-ja.com

WPFのサイズ変更可能なウィンドウから最小化と最大化を削除するにはどうすればよいですか?

WPFには、サイズ変更を許可するが最大化または最小化ボタンがないウィンドウを表示する機能はありません。このようなウィンドウを作成して、サイズ変更可能なダイアログボックスを作成できるようにします。

私は解決策がピンボークを使用することを意味することを知っていますが、何をどのように呼び出すべきかわかりません。 pinvoke.netを検索しても、必要なものとして飛び出したものは見つかりませんでした。主に、Windows FormsがCanMinimizeおよびCanMaximizeプロパティを提供しているためです窓。

誰かが私にこれを指示するか、これを行う方法のコード(C#が望ましい)を提供できますか?

73
Nidonocu

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

お役に立てれば!

104
Matt Hamilton

1つの方法は、ResizeMode="NoResize"。このように動作します。 enter image description here

これがお役に立てば幸いです!

81
Musikero31

これがあなたの要求に合うかどうかわからない。視覚的に..これは

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

誰かがDevexpressウィンドウ(DXWindow)を使用すると、受け入れられた回答は機能しません。 Oneいアプローチは

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

ここに私が使用しているソリューションがあります。最大化ボタンはまだ表示されていることに注意してください。

マークアップ:

<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;
}
3
Andrej

最小化および最大化ボタンを削除する場合は、ウィンドウのResizeMode = "NoResize"を設定できます。

2
Chinmay Behera

@ -MattHamiltonによる ソリューション案 のこのバリアントは、Windowのコンストラクターで呼び出すことができます(また、呼び出す必要があります)。秘Theは、拡張メソッド内で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);
    };
}