私は基本的に、タイトル バー (グリッド自体) をドラッグして場所を変更できる単純なフローティング パネルを作成しています。しかし、私はそれを働かせることができません!MouseEventArgs.GetPosition
間違ったポイントを返すようです。ここで何が欠けていますか?
public class FloatingPanel : Grid
{
Grid gridTitle;
bool dragging = false;
Point lastPos;
public FloatingPanel(UserControl gadget)
{
this.MouseMove += FloatingPanel_MouseMove;
gridTitle = new Grid();
gridTitle.Height = 25;
gridTitle.VerticalAlignment = System.Windows.VerticalAlignment.Top;
gridTitle.Background = Brushes.Cyan;
gridTitle.MouseLeftButtonDown += gridTitle_MouseLeftButtonDown;
gridTitle.MouseLeftButtonUp += gridTitle_MouseLeftButtonUp;
this.Children.Add(gridTitle);
this.Height = gadget.Height + 25;
this.Width = gadget.Width;
gadget.VerticalAlignment = System.Windows.VerticalAlignment.Bottom;
this.Children.Add(gadget);
}
void gridTitle_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
dragging = false;
}
void gridTitle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
lastPos = Mouse.GetPosition(this);
dragging = true;
}
void FloatingPanel_MouseMove(object sender, MouseEventArgs e)
{
if(dragging)
{
Vector delta = e.GetPosition(this) - lastPos;
this.Margin = new Thickness(this.Margin.Left + delta.X, this.Margin.Top + delta.Y, this.Margin.Right, this.Margin.Bottom);
lastPos = e.GetPosition(this);
}
}
}
画面上の位置を指定するSystem.Windows.Forms.Cursor.Position
andも使用してみました。System.Windows.Forms.Control.MousePosition
しかし、運がありません。
解決策:この問題は 3 つの修正によって解決されました (Sphinxxx が指摘したように):
-MouseEventArgs.GetPosition(null)
の代わりに使用MouseEventArgs.GetPosition(this)
- マウスのキャプチャと解放、mousedown
およびを使用したmouseup
イベント
- グリッドの水平方向と垂直方向の配置の設定。(これは私には奇妙に思えます。うなずきの配置を設定すると問題が発生するのはなぜですか?)Mouse.Capture(gridTitle)
Mouse.Capture(null)