Xaml 如何在画布内绑定形状/控件的绝对坐标

Xaml 如何在画布内绑定形状/控件的绝对坐标,xaml,windows-store-apps,winrt-xaml,uwp,mvvm-light,Xaml,Windows Store Apps,Winrt Xaml,Uwp,Mvvm Light,在Windows 8.1 Metro应用程序上,我正在尝试将视图模型中的一组形状绑定到MainPage.xaml中。每个形状都有一个Left,Top,还有一个PathData,它是一个RectangleGeometry,其中包含我想要在画布内相应位置绘制的矩形 这是XAML: <Grid Background="Black"> <ItemsControl ItemsSource="{Binding Shapes}"> <ItemsContro

在Windows 8.1 Metro应用程序上,我正在尝试将视图模型中的一组形状绑定到MainPage.xaml中。每个形状都有一个
Left
Top
,还有一个
PathData
,它是一个
RectangleGeometry
,其中包含我想要在画布内相应位置绘制的矩形

这是XAML:

<Grid Background="Black">
    <ItemsControl ItemsSource="{Binding Shapes}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemContainerStyle>
            <Style TargetType="ContentPresenter">
                <Setter Property="Canvas.Top" Value="{Binding Top}"/>
                <Setter Property="Canvas.Left" Value="{Binding Left}"/>
            </Style>
        </ItemsControl.ItemContainerStyle>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Path Data="{Binding PathData}" Stroke="White" StrokeThickness="3" Canvas.Left="{Binding Left}" Canvas.Top="{Binding Top}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

数据上下文已设置并正常工作。我从MainViewModel中填充形状,矩形确实会出现在屏幕上,但问题是我无法将矩形放置在
画布中
左侧
顶部
的确切位置,即它们只是放置在(0,0)处

我尝试了绑定
路径
Canvas.Left
Canvas.Top
(我尝试过的明显方法)以及使用
样式
设置
ItemContainerStyle
(我从一个WPF示例中找到的一种方法)来完成同样的操作。但这两种方法都不起作用(我在xaml中添加了这两种方法以供参考)

那么,我做错了什么?我如何使矩形显示在相应的位置



编辑:我的问题与其他问题相同,只是我的目标是windows metro/uwp,而接受的答案对其不起作用。

通过绑定到
转换来解决问题

<Path Data="{Binding PathData}" Stroke="White" StrokeThickness="3">
    <Path.RenderTransform>
         <CompositeTransform TranslateX="{Binding Left}" TranslateY="{Binding Top}"/>
    </Path.RenderTransform>
</Path>

通过绑定到一个
转换来解决这个问题

<Path Data="{Binding PathData}" Stroke="White" StrokeThickness="3">
    <Path.RenderTransform>
         <CompositeTransform TranslateX="{Binding Left}" TranslateY="{Binding Top}"/>
    </Path.RenderTransform>
</Path>