2017-07-13 18 views
0

私は自分のエディタでWPFフォームを作成しています。私の問題は、複数のコントロール(ボタン、ラベルなど)を選択し、それらをメインウィンドウ全体にスムーズにドラッグする最悪の時間を抱えていることです。私のアプリケーションは、私がドラッグすると、ああ、20の選択されたボタンを同時にしようとするとチョークします。複数の四角形を描画するとWPFアプリケーションがチョークする

私は、オブジェクトがドラッグされているときに複数の矩形を描画しており、この関数がMouseMoveイベントで呼び出されているという事実を発見しました。

void ControlObjectControl_MouseMove(object sender, MouseEventArgs e) 
{  
    if (newPosition != oldPosition) 
    {   
     DragSelection(newPosition); 
    } 
} 

private void DragSelection(Point newPosition) 
{ 


    foreach (FrameworkElement item in designer.SelectionService.CurrentSelection) 
     { 
     if (item is ObjectControl) 
      (item as ObjectControl).m_ParentControlObject.Position = new System.Drawing.Rectangle() { X = X, Y = Y, Width = (int)item.Width, Height = (int)item.Height }; 
      //..There's code that calculates the item's position and dimensions  
    } 

} 

は、どのように私はそれが一度だけの四角形を描画する場所にそれを作るのですか、私はまだ私の選択したオブジェクト(複数可)、私はそれらをドラッグするとスムーズに移動を見ることができるのですか?

+0

WPFはDirectXを使用しています。本当に深く掘り下げなくてもできることはありません。透明なパネルを作成し、選択したすべてのコントロールを追加してから、各コントロールの代わりにパネルを移動し、mouseupのときにフォームにダンプすることができます。私は正直なところ、VS /他の人がどのようにしているかに精通していませんが、それはおそらくどこから始めるのでしょうか(誰かが組み込みのソリューションを持っていない限り)。しかし、それは困難な/論理的な集約を作るかもしれません。 – Aaron

+0

@Aaronはいそうです。私はディスパッチャを使ってみましたが、バックグラウンドでコードを実行させましたが、それはちょうどドラッグ機能を奇妙にしました。私はこの問題をさらに調べます。私の最初の反応でありがとう。 – user3838697

答えて

2

要素を移動するのにTranslateTransformを使用した以外は、私のアプリケーションで同様のことをしました。私がドラッグしていた各 "フレーム"(すべてのマウスの動き)は、マウスの位置を取得し、それをマウスの以前の位置と比較しました。私は新しいTranslateTransformのX/Y値をX/Yマウスの位置の変化と同じに設定して、移動したい各オブジェクトのRenderTransformにそれを与えます。次のようなものがあります:

void ControlObjectControl_MouseMove(object sender, MouseEventArgs e) 
{  
    if (dragging) 
    { 
     // Get the change in Location   
     mouseLocation = Mouse.GetPosition(); 
     Point deltaLocation = mouseLocation - previousLocation; 

     // Make a new transform 
     TranslateTransform transform = new TranslateTransform(); 
     transform.X = deltaLocation.X; 
     transform.Y = deltaLocation.Y; 

     // Apply the transform 
     // foreach thing 
     thing.RenderTransform = transform; 

     // set previous location 
     previousLocation = mouseLocation; 
    } 
} 

ここでオブジェクトは1度だけ描画され、その位置だけが変更されます。これが役に立ちますようにお願いします。