9

ボーダレス WPF メイン ウィンドウがあります。エンドユーザーがウィンドウをドラッグできるようにしようとしています。

Window のコンストラクターに以下を追加しました。

this.MouseLeftButtonDown += delegate { DragMove(); };

問題は、2 つのボタンで開くダイアログ ボックスがあることです。これらのボタンの 1 つをクリックすると、InvalidOperationException が処理されず、「マウスのプライマリ ボタンが押されているときにのみ DragMove を呼び出すことができます」というメッセージが表示されます。

これはいくつかの疑問を投げかけます: ダイアログのマウスダウン イベントがこれと関係があるのはなぜですか? この例外なしでこれを行うにはどうすればよいですか?

ありがとう!

4

4 に答える 4

8

ボーダレス ウィンドウを移動可能にする「正しい」方法は、WM_NCHITTEST メッセージで HTCAPTION を返すことです。次のコードは、その方法を示しています。カーソルが Window の特定の視覚要素の上にある場合は HTCLIENT を返す必要があることに注意してください。したがって、このコードは単に開始するためのものです。

http://msdn.microsoft.com/en-us/library/ms645618(VS.85).aspx

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    protected override void OnSourceInitialized(EventArgs e)
    {
        HwndSource hwndSource = (HwndSource)HwndSource.FromVisual(this);
        hwndSource.AddHook(WndProcHook); 
        base.OnSourceInitialized(e);
    }

    private static IntPtr WndProcHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handeled)
    {
        if (msg == 0x0084) // WM_NCHITTEST
        {
            handeled = true;
            return (IntPtr)2; // HTCAPTION
        }
        return IntPtr.Zero;
    }
}
于 2010-07-18T13:37:47.223 に答える
1

使用するウィンドウまたはその他のコントロールの MouseDown 属性を設定します。

<TextBlock Grid.Column="0" HorizontalAlignment="Stretch"  MouseLeftButtonDown="TextBlock_MouseLeftButtonDown" >Handy Dandy</TextBlock>

そして、次のようにコード ビハインドに実装します。

private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
     this.DragMove();
}

から: http://www2.suddenelfilio.net/2007/01/19/wpf-draggable-windowless-windows/

于 2012-03-13T17:08:48.500 に答える
0

すべての「ウィンドウレス」スタイルなどを処理するMicrosoftプロジェクトがあり、それはオープンソースです。http://code.msdn.microsoft.com/WPFShellを参照してください。私は商用の金融アプリケーションで使用していますが、どのバージョンのWindowsでもまだ問題は発生していません。

于 2010-08-29T14:13:58.437 に答える
0

元のメソッドをオーバーライドできます。

 public new void DragMove()
     {
        if (this.WindowState == WindowState.Normal)
        {
            SendMessage(hs.Handle, WM_SYSCOMMAND, (IntPtr)0xf012, IntPtr.Zero);
            SendMessage(hs.Handle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
        }
    }
于 2012-07-27T16:16:18.470 に答える