4

キャプションをダブルクリックしてWPFウィンドウの最大化を無効にし、サイズ変更を利用できるようにする方法は?


ResizeModeが最大化を無効にすることは知っていますが、フォームのサイズ変更も防止します

ResizeMode="CanMinimize"

最大化ボタンと最小化ボタンを削除する方法は知っていますが、キャプションをダブルクリックして最大化することは可能です。

WinForms では、簡単に実現できます。FormBorderStyleNoneからFixedSingleまたはFixed3Dに設定するだけです。しかし、それはもはや WPF のオプションではありません。


PS WM_GETMINMAXINFO、WM_SYSCOMMANDなどを処理するいくつかのトリックを試していますが、うまくいかないようです...

4

6 に答える 6

8

WPFウィンドウでの非クライアントマウスアクティビティの検出に関するMSDNの助けを借りて、私がまとめた良い解決策。

ifを呼び出すhandled = trueと、ユーザーが非クライアント領域をダブルクリックしたときにウィンドウが最大化されなくなります。WndProcmsg == WM_NCLBUTTONDBLCLK

myClass()  //c'tor
{
  InitializeComponent();
  SourceInitialized += new EventHandler(myClass_SourceInitialized);  
}

void myClass_SourceInitialized(object sender, EventArgs e)
{
    System.Windows.Interop.HwndSource source = System.Windows.Interop.HwndSource.FromHwnd(new System.Windows.Interop.WindowInteropHelper(this).Handle);
    source.AddHook(new System.Windows.Interop.HwndSourceHook(WndProc));
}

int WM_NCLBUTTONDBLCLK { get { return 0x00A3; } }

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (msg == WM_NCLBUTTONDBLCLK)
    {
        handled = true;  //prevent double click from maximizing the window.
    }

    return IntPtr.Zero;
}

役立つ MSDN 参照: https://social.msdn.microsoft.com/Forums/vstudio/en-US/f54dde25-b748-4724-a7fe-a355b086cfd4/mouse-event-in-the-nonclient-window-area

于 2014-11-07T21:32:19.977 に答える
2

この問題に遭遇し、この SO の質問を調査した後、回答が不十分であると判断しました。タイトル バーを削除した後でも、ウィンドウの上部近くをダブルクリックすると、ウィンドウが最大化されます。

タイトル バーを削除し、ウィンドウのダブルクリックを無効にする方法を選択しました。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        MouseDoubleClick += (sender, args) =>
        {
            args.Handled = true;
        };
    }
}

私のアプリケーションでは、 Windowの代わりにMetroWindowから継承する MahApps.Metro を使用していましたが、上記の例はどちらの場合でも機能するはずです。

于 2014-03-23T09:40:42.500 に答える
2

WPFには、ウィンドウの最大化を無効にするネイティブな方法がありません ( WinFormsとは異なります)。したがって、次の重要な点を考慮してください。

1. 最大化ボタンを隠す

WinAPIを使用するのも 1 つの方法ですが、最大化ボタンを非表示にするためだけです。以下を使用します。

[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

private const int GWL_STYLE = -16;
private const int WS_MAXIMIZEBOX = 0x10000;

private void Window_SourceInitialized(object sender, EventArgs e)
{
    var hwnd = new WindowInteropHelper((Window)sender).Handle;
    var value = GetWindowLong(hwnd, GWL_STYLE);
    SetWindowLong(hwnd, GWL_STYLE, (int)(value & ~WS_MAXIMIZEBOX));
}

2. 最大化の手動処理

上記のコードでも最大化が可能です (たとえば、ウィンドウのタイトルをダブルクリックします)。

WPFでは、タイトル バーの動作を制御できません。ダブルクリックの動作を変更したい場合は、タイトル バーを削除して独自に作成する必要があります。それがMahApps.Metroでどのように行われたかを見てみましょう-サンプルへのリンク。その後、ダブルクリックイベントを処理します。

于 2013-11-26T02:06:16.610 に答える