2011年6月4日土曜日

タイトルバーのドラッグ以外でウィンドウを移動する

ソフトウェアキーボードではタイトルバーを持たない形(WindowStyle.None)を取ることが多いです。
その場合にはタイトルバーをドラッグしてウィンドウを移動すると言う一般的な方法は使えません。

その代替として有効な手段が、領域内を左クリックドラッグでウィンドウを移動する方法です。
WPFではWindowクラスのDragMove()を使うことで非常に簡単に実装することができます。
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
    base.OnMouseLeftButtonDown(e);

    this.DragMove();
}

ただ、先日の投稿の方法でアクティブにならないウィンドウを作った場合には、ドラッグ中のフィードバックが行われません。
#マウスアップまでウィンドウが移動しない
これはタイトルバーを残していた場合にも同様です。

私は見かけ的に好きではないので、以下のようにしてマウスドラッグ時にウィンドウを移動しています。
bool dragFlag;
Point offset;

private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    dragFlag = true; // ドラッグ開始
    offset = e.GetPosition(this); // 開始位置の記録
}

private void Window_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
    if (dragFlag) // ドラッグ時のみ
    {
        Point p = e.GetPosition(this); // 現在のマウス座標
        // ウィンドウを移動
        this.Left += p.X -offset.X;
        this.Top += p.Y - offset.Y;
    }
}

private void Window_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    dragFlag = false; // ドラッグ終了
}

この方法だとマウスムーブに合わせてきちんとウィンドウが移動されます。
今回だけに言えることじゃないですが、これがベストの方法とは限らないことを理解いただいた上で、参考にしていただけると幸いです。

0 件のコメント:

コメントを投稿