wpf 将多个RenderTransforms应用于UIElements

cdmah0mi  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(112)

我正在Canvas上创建具有弯曲边缘的Path对象。我希望能够旋转它们并在画布上移动它们。但是当我尝试对对象应用几个变换时,它只在视觉上显示最后一个。我认为这是因为转换应用于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));                    
                }
            };

这段代码允许我移动我的元素,它工作得很好:我可以把它捡起来,在视觉上移动它,然后让它走。但只有一次。如果再尝试一次,它会尝试根据元素之前的位置进行转换。当我输入这个的时候,我意识到我可以通过跟踪转换引起的偏移来解决这个问题。

xpcnnkqh

xpcnnkqh1#

只需将下一个平移添加到现有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);

相关问题