91

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

解決策はpinvokeを使用することを意味することは承知していますが、何をどのように呼び出すかはわかりません。pinvoke.netを検索しても、必要なものとして私に飛び出したものは何も見つかりませんでした。主に、WindowsフォームがそのウィンドウCanMinimizeCanMaximizeプロパティを提供しているためです。

誰かが私にこれを行う方法を教えたり、コード(C#を推奨)を提供したりできますか?

4

7 に答える 7

122

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

お役に立てれば!

于 2008-12-04T05:00:23.470 に答える
105

1 つの方法は、ResizeMode="NoResize". このような挙動になります。 ここに画像の説明を入力

これが役立つことを願っています!

于 2011-10-06T01:44:46.823 に答える
25

これが要件で機能するかどうかはわかりません。視覚的に..これは

<Window x:Class="DataBinding.MyWindow" ...Title="MyWindow" Height="300" Width="300" 
    WindowStyle="ToolWindow" ResizeMode="CanResizeWithGrip">
于 2008-12-04T05:33:17.477 に答える
6

誰かが Devexpress ウィンドウ (DXWindow) を使用している場合、受け入れられた回答は機能しません。1つの醜いアプローチは

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;
    } 
}
于 2013-03-28T09:52:13.093 に答える
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;
}
于 2011-05-10T19:33:04.190 に答える
2

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

于 2010-09-15T04:38:58.653 に答える