旋转和调整对象大小

问题描述 投票:0回答:2

我们使用装饰器在画布上拖放、旋转和调整对象大小。这工作得很好,但是当在画布上或其子集上选择所有对象时,我们尝试旋转它们或调整它们的大小,每个对象都会向不同的方向运行。专家可以给我们一些线索,看看哪里可以做吗?

我们将不胜感激。

谢谢。

c# wpf
2个回答
2
投票

我也遇到了类似的问题。这是我实现的代码:

private void DragThumb_DragDelta(object sender, DragDeltaEventArgs e)
{
    var designerItem = this.DataContext as DesignerItem;
    var designer = VisualTreeHelper.GetParent(designerItem) as DesignerCanvas;

    if (designerItem != null && designer != null && designerItem.IsSelected)
    {
        var minLeft = double.MaxValue;
        var minTop = double.MaxValue;

        //We only move DesignerItems
        var designerItems = designer.SelectionService.CurrentSelection.OfType<DesignerItem>();

        foreach (var item in designerItems)
        {
            var left = Canvas.GetLeft(item);
            var top = Canvas.GetTop(item);

            minLeft = double.IsNaN(left) ? 0 : Math.Min(left, minLeft);
            minTop = double.IsNaN(top) ? 0 : Math.Min(top, minTop);
        }

        var deltaHorizontal = Math.Max(-minLeft, e.HorizontalChange);
        var deltaVertical = Math.Max(-minTop, e.VerticalChange);

        foreach (var item in designerItems)
        {
            var rotateTransform = designerItem.RenderTransform as RotateTransform;
            var left = Canvas.GetLeft(item);
            var top = Canvas.GetTop(item);

            if (double.IsNaN(left)) 
                left = 0;

            if (double.IsNaN(top)) 
                top = 0;

            if (rotateTransform != null)
            {
                var dragDelta = new Point(e.HorizontalChange, e.VerticalChange);
                dragDelta = rotateTransform.Transform(dragDelta);

                Canvas.SetLeft(item, left + dragDelta.X);
                Canvas.SetTop(item, top+ dragDelta.Y);
            }
            else
            {
                Canvas.SetLeft(item, left + deltaHorizontal);
                Canvas.SetTop(item, top + deltaVertical);
            }
        }

        designer.InvalidateMeasure();
        e.Handled = true;
    }
}

如果您解决了问题,请告诉我。


1
投票

您可能正在寻找此处提出的边界框解决方案:http://social.msdn.microsoft.com/Forums/en/wpf/thread/54659b47-554c-47da-8158-c944687e7339

装饰您选择的对象所在的任何表面,因为这是您选择的范围。手动定位装饰器并调整其大小,而不是使用装饰器的默认行为。

© www.soinside.com 2019 - 2024. All rights reserved.