このコードに問題があります。プログラムを開始すると、定規はページの中央にあります。MouseDown が true のときに mousemove を実行すると、Rectangle (ルーラー) を自由にドラッグできます。ただし、これは最初のドラッグでのみ機能します。次回ドラッグすると、ルーラーは元の位置にジャンプして戻ります。マウスをその上に置くと、元の位置から元に戻った位置までの距離が計算され、マウスアップ イベントが発生しないため、画面から飛び出します。長方形が移動したので。基本的に、オブジェクトを画面上で何度でもドラッグできるようにしたいのですが、XStart と YStart は、クリックするたびに新しいレンダリング値を取得する必要があります。
その理由は e.GetPosition(this).X; に関係していると思います。「this」はルーラーの親であるグリッドを参照するためです。
RenderTransform をプログラムにコミットする必要がありますか? または私のロジックにエラーがありますか?
正直なところ、まったく機能しなかった方が理にかなっていますが、一度完全に機能した後、失敗することは意味がありません.
コードは次のとおりです。
private void Rectangle_MouseDown(object sender, MouseButtonEventArgs e)
{
XStart = e.GetPosition(this).X;
YStart = e.GetPosition(this).Y;
Console.WriteLine("X: " + XStart + ", Y: " + YStart);
MouseDown = true;
}
private void Rectangle_MouseMove(object sender, MouseEventArgs e)
{
if(MouseDown)
{
X = e.GetPosition(this).X - XStart;
Y = e.GetPosition(this).Y - YStart;
Ruler.RenderTransform = new TranslateTransform(X, Y);
}
}
private void Ruler_MouseUp(object sender, MouseButtonEventArgs e)
{
MouseDown = false;
}