是否可以将RenderTransform应用于实际的UIElements?

时间:2017-10-20 19:56:13

标签: c# wpf

我正在Path创建带有曲线边缘的Canvas个对象。我希望能够旋转它们并在画布上移动它们。但是当我尝试将几个变换应用于对象时,它只能直观地显示最后一个。我假设它是因为变换应用于Path对象的坐标,并且只显示但之后不保存。

所以如果我会运行类似的东西:

my_canvas.Children[0].RenderTransform = new TranslateTransform(0, 100);
my_canvas.Children[0].RenderTransform = new TranslateTransform(0, 150);

它会将Path 150像素向下移动。

有没有办法可以保存RenderTransform的转换进度,还是我必须使用不同的参数重新创建Path /写一个方法来手动取代像素?

修改

另一个例子:

my_canvas.Children[0].MouseDown += (object sender, MouseButtonEventArgs e) => 
            {
                if (e.LeftButton == MouseButtonState.Pressed)
                {
                    MouseDownLocation = e.GetPosition(my_canvas);
                }
            };

            my_canvas.Children[0].MouseMove += (object sender, MouseEventArgs e) =>
            {
                if (e.LeftButton == MouseButtonState.Pressed)
                {                    
                    my_canvas.Children[0].RenderTransform  = new TranslateTransform(-(MouseDownLocation.X - e.GetPosition(my_canvas).X), -(MouseDownLocation.Y - e.GetPosition(my_canvas).Y));                    
                }
            };

此代码允许我移动我的元素,它工作正常:我可以拿起它,视觉移动它,然后放手。但只有一次。如果尝试再次尝试,它会尝试根据元素进行转换。以前的位置。当我输入这个时,我意识到我可以通过跟踪转换引起的偏移来解决这个问题。

1 个答案:

答案 0 :(得分:0)

只需将下一个转换添加到现有RenderTransform的X和Y值:

my_canvas.Children[0].RenderTransform = new TranslateTransform(0, 100);
((TranslateTransform)my_canvas.Children[0].RenderTransform).Y += 150;

或者使用Canvas.Left和Canvas.Top而不是TranslateTransform:

UIElement element = my_canvas.Children[0];
Canvas.SetTop(element, 100);
Canvas.SetTop(element, Canvas.GetTop(element) + 150);