C# XAML:在不变换元素的情况下变换面板上的位置

C# XAML:在不变换元素的情况下变换面板上的位置,c#,wpf,xaml,C#,Wpf,Xaml,我想在画布上定位元素(在我的例子中是几个图形和文本元素),并通过变换变换这些元素的位置,但不变换元素本身。变换需要动态更改,如调整大小或更改旋转角度。我不想接触元素,只想接触我绑定到的转换 我现在所拥有的: 显然,elementCanvas的位置设置了包含的图形和文本的位置。在EllipseGeometry上设置Transform,可变换整个几何体。我找不到在XAML中转换点的方法,例如EllipseGeomtry的Center-属性。但这不会改变文本块的位置 转换Canvas.Top和Ca

我想在
画布上定位元素(在我的例子中是几个图形和文本元素),并通过
变换
变换这些元素的位置,但不变换元素本身。
变换
需要动态更改,如调整大小或更改旋转角度。我不想接触元素,只想接触我绑定到的转换

我现在所拥有的:


显然,elementCanvas的位置设置了包含的图形和文本的位置。在
EllipseGeometry
上设置
Transform
,可变换整个几何体。我找不到在XAML中转换
点的方法,例如EllipseGeomtry的
Center
-属性。但这不会改变
文本块的位置


转换
Canvas.Top
Canvas.Left
就足够了,我想,但这怎么办呢?

如果你不想
转换
UI元素,那么就不要在它们上面使用任何类型的
转换
对象。如果在
画布上数据绑定元素的位置,则只需更新相关元素的相关属性,它们就会相应地移动:

<Style x:Key="ElementStyle">
    <Setter Property="Canvas.Left" Value="{Binding Left}" />
    <Setter Property="Canvas.Top" Value="{Binding Top}" />
</Style>

<ItemsControl ItemsSource="{Binding YourElements}"
    ItemsContainerStyle="{StaticResource ElementStyle}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

为了清楚起见,您必须在表示UI元素的数据类中声明一个
Left
和一个
Top
项目。您可以阅读MSDN上的页面,了解有关一般数据绑定的更多信息。

我使用了一个通用解决方案,该解决方案允许我使用转换在画布上定位元素:

多重绑定

我创建了两个接受变换和坐标的多重绑定类(对于平移、缩放和剪切,它只需要一个坐标,但是对于旋转,它需要X和Y),并返回通过变换转换的坐标。所以我计算了两个多重绑定中的两个坐标

对于点,我有第三个多绑定转换器,它返回转换的点


它在XAML中使用了一些行,但在codebehind中没有特定的代码,画布的缩放非常有效。

这正是我想要避免的:检查每个元素并手动更改位置。
转换
应该是我唯一需要更改的内容。。。更新了问题以使其更清晰。我认为转换Canvas.Top和Canvas.Left就足够了,但如何才能做到这一点呢?。。。这是如何完成的。我应该如何将
转换
绑定到
Canvas.Top
?为了完整起见,可以使用
多绑定
转换器将
转换
绑定到
Canvas.Top
。看看我自己的答案。
element.Left = newPosition.X;
element.Top = newPosition.Y;