绘制多个矩形会使我的WPF应用程序窒息

时间:2017-07-13 18:10:44

标签: c# wpf

我正在自己的编辑器中制作WPF表单。我的问题是我最糟糕的时候选择多个控件(按钮,标签等)并在主窗口中平滑拖动它们。当我试图同时拖动20个选定的按钮时,我的应用程序会窒息。

我发现罪魁祸首是我在拖动每个对象时绘制多个矩形,并在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       
    }

}

如何将其绘制到仅绘制矩形一次的位置,当我拖动它时,我仍然能够看到所选对象的移动顺畅?

1 个答案:

答案 0 :(得分: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;
   }
}

现在你的对象只被绘制一次,只有它们的位置会被改变。希望这有帮助