我正在自己的编辑器中制作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
}
}
如何将其绘制到仅绘制矩形一次的位置,当我拖动它时,我仍然能够看到所选对象的移动顺畅?
答案 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;
}
}
现在你的对象只被绘制一次,只有它们的位置会被改变。希望这有帮助