如何将画布的x,y原点更改为Center,WPF

时间:2014-04-04 05:47:16

标签: wpf canvas wpf-controls

伙计我使用画布作为ItemsPanelTemplate并将其绑定到包含典型行起点和终点的行列表

<ItemsControl ItemsSource="{Binding Path = LineList}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

现在。我想将中心点移动到画布的中间而不是左上角。我面前的选项很少

  1. 使用值转换器并根据画布大小调整值并显示[调整x和y值]
  2. 按照以下帖子中提及的方式转换画布:How to change x,y origin of canvas...?Ray's answer
  3. 我知道如何通过第一种方法来实现,但是当我尝试第二种方法时,它并没有改变坐标系。这是为什么?我刚刚在我的代码中替换了答案,如下所示。我错过了什么吗?

    ****更新****:以下代码正常运行

    <ItemsControl ItemsSource="{Binding Path = LineList}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
               <Canvas>
                 <Canvas.LayoutTransform>
                   <ScaleTransform ScaleX="1" ScaleY="-1" CenterX=".5" CenterY=".5" />
                 </Canvas.LayoutTransform>
              </Canvas>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
    

1 个答案:

答案 0 :(得分:5)

示例中ScaleTransform的CenterXCenterY属性实际上并不移动Canvas。此外,LayoutTransform无论如何都会忽略翻译(请参阅备注here)。您可以使用适当的RenderTransform作为Canvas:

<ItemsPanelTemplate>
    <Canvas>
        <Canvas.RenderTransform>
            <TransformGroup>
                <ScaleTransform ScaleX="2" ScaleY="2"/>
                <TranslateTransform
                    X="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=Canvas}}"
                    Y="{Binding ActualHeight, RelativeSource={RelativeSource AncestorType=Canvas}}"/>
                <ScaleTransform ScaleX="0.5" ScaleY="0.5"/>
            </TransformGroup>
        </Canvas.RenderTransform>
    </Canvas>
</ItemsPanelTemplate>