8

私はパネルを持っています。そのパネル内にはいくつかの長方形のコントロール(コントロールベールの数)があります。ユーザーがパネル内でコントロールを移動できるようにして、ユーザーが自分に最も適した方法でコントロールを配置できるようにします。誰かが私が読むことができるリソースや私を正しい道に向かわせる簡単なヒントを持っていますか?

ありがとう

4

2 に答える 2

10

コントロールをドラッグ/移動スタイルで移動するための、可能な簡単な方法を見つけました...手順は次のとおりです。

  1. 移動領域にしたいコントロールの要素を選択します。これは、ユーザーがマウスを押したままにすると、コントロールが移動する領域です。私の場合、それはコントロールの上部にある長方形の境界線でした。
  2. OnMouseDownイベントを使用してブール値(私の場合はIsMoving)をtrueに設定し、MouseUpイベントを使用してfalseに設定します
  3. 最初のMouseDownイベントで、次のコードを使用してPointプロパティ(InitialPosition)を設定します

    if (FirstClick)
    {
         GeneralTransform transform = this.TransformToAncestor(this.Parent as Visual);
         Point StartPoint = transform.Transform(new Point(0, 0));
         StartX = StartPoint.X;
         StartY = StartPoint.Y;
         FirstClick = false;
    }
    
  4. 開始位置が決まったので、移動コントロールに対するマウスの位置を取得する必要があります。これは、ヘッダーの中央をクリックしてヘッダーを移動することなく、コントロールの左上をマウスポインターの位置に瞬時に移動するためです。これを行うには、次のコードをMouseDownイベントに配置します。

    Point RelativeMousePoint = Mouse.GetPosition(Header);
    RelativeX = RelativeMousePoint.X;
    RelativeY = RelativeMousePoint.Y;
    
  5. これで、コントロールの起点(startXおよびSTartY)、移動コントロール内のマウスの位置(RelativeX、RelativeY)がわかりました。コントロールを新しい場所に移動するだけです!これを行うには、いくつかの手順が必要です。まず、コントロールには、TranslateTransformであるRenderTransformが必要です。これをXAMLで設定したくない場合は、を使用して自由に設定してthis.RenderTransform = new TranslateTransformください。

  6. 次に、コントロールが新しい場所に移動するように、RenderTransformでX座標とY座標を設定する必要があります。次のコードはこれを実現します

    private void Header_MouseMove(object sender, MouseEventArgs e)
    {
        if (IsMoving)
        {
            //Get the position of the mouse relative to the controls parent              
            Point MousePoint = Mouse.GetPosition(this.Parent as IInputElement );
            //set the distance from the original position
            this.DistanceFromStartX= MousePoint.X - StartX - RelativeX ;
            this.DistanceFromStartY= MousePoint.Y - StartY - RelativeY;
            //Set the X and Y coordinates of the RenderTransform to be the Distance from original position. This will move the control
            TranslateTransform MoveTransform = base.RenderTransform as TranslateTransform;
            MoveTransform.X = this.DistanceFromStartX;
            MoveTransform.Y = this.DistanceFromStartY;
        }
    }
    

ご想像のとおり、コードが少し省略されています(変数宣言など)が、コーディングを開始するために必要なのはこれだけです:)ハッピーコーディング。

編集:
発生する可能性のある問題の1つは、これにより、コントロールを親コントロールの領域から移動できることです。これは、その問題を修正するための簡単で汚いコードです...

if ((MousePoint.X + this.Width - RelativeX > Parent.ActualWidth) ||
     MousePoint.Y + this.Height - RelativeY > Parent.ActualHeight ||
     MousePoint.X - RelativeX  < 0 || 
     MousePoint.Y - RelativeY  < 0)
{
    IsMoving = false;
    return;
}

実際の移動が行われる前に、このコードをMouseMoveイベントに配置します。これにより、コントロールが親コントロールの境界外に移動しようとしているかどうかがチェックされます。このIsMoving = falseコマンドにより、コントロールは移動モードを終了します。これは、コントロールが境界で停止するため、ユーザーがコントロールを移動するために移動領域をもう一度クリックする必要があることを意味します。コントロールに自動的に移動を継続させたい場合は、その行を削除するだけで、合法的な領域に戻るとすぐにコントロールがカーソルに戻ります。

于 2010-05-14T02:54:18.033 に答える