0

アドナーを使用して、キャンバス上のオブジェクトをドラッグ/ドロップ、回転、およびサイズ変更しています。それは問題なく動作しますが、すべてのオブジェクトがキャンバスまたはそのサブセットで選択され、それらを回転またはサイズ変更しようとすると、各オブジェクトが異なる方向に実行されます。専門家は、どこを見ればよいか、何ができるかについての手がかりを教えてくれますか?

それは非常に高く評価されます。

ありがとう。

4

2 に答える 2

2

私は同様の問題を抱えていました。実装したコードは次のとおりです。

void DragThumb_DragDelta(object sender, DragDeltaEventArgs e)
    {
        DesignerItem designerItem = this.DataContext as DesignerItem;
        DesignerCanvas designer = VisualTreeHelper.GetParent(designerItem) as DesignerCanvas;
        if (designerItem != null && designer != null && designerItem.IsSelected)
        {
            double minLeft = double.MaxValue;
            double minTop = double.MaxValue;

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

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

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

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

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

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

                if (rotateTransform != null)
                {
                    Point 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;
        }
    }

問題が解決した場合はお知らせください。

于 2012-09-19T18:55:31.603 に答える
1

ここで提案されているバウンディング ボックス ソリューションを探しているかもしれません: http://social.msdn.microsoft.com/Forums/en/wpf/thread/54659b47-554c-47da-8158-c944687e7339

それが選択の範囲であるため、選択したオブジェクトが置かれている表面を飾ります。Adorner のデフォルトの動作を使用する代わりに、手動で adorner の位置とサイズを調整します。

于 2012-06-28T16:24:14.520 に答える