Wpf 更改控制画布中的零点

Wpf 更改控制画布中的零点,wpf,xaml,canvas,Wpf,Xaml,Canvas,在画布中绘制项目时,位置是从画布中项目的顶部开始: <Canvas Name="cnvMain" Width="80" Height="80"> <Ellipse Canvas.Top="20" Canvas.Left="40" Width="40" Height="40" Fill="Gray" /> </Canvas> 现在我

在画布中绘制项目时,位置是从画布中项目的顶部开始:

<Canvas Name="cnvMain"
        Width="80"
        Height="80">
  <Ellipse Canvas.Top="20"
           Canvas.Left="40"
           Width="40"
           Height="40"
           Fill="Gray" />
</Canvas>

现在我需要的是从元素的底部进行测量,如下所示:

最后,我希望能够设置从椭圆底部到画布顶部的距离。 注:椭圆有时不能是圆,翻转它不是一个选项。此外,我不知道运行前的高度,因此在xaml中设置负边距也不起作用。


(图片和示例xaml取自:)

如果要指定椭圆底部到画布底部的距离,可以将
Canvas.Top
替换为
Canvas.bottom

<Ellipse Canvas.Bottom="20" Canvas.Left="40" Width="40" Height="40" Fill="Gray"/>

对于从椭圆底部到画布顶部的距离,可以指定负边距:

<Ellipse Canvas.Top="20" Canvas.Left="40" Width="40" Height="40" Fill="Gray"
         Margin="0,-40,0,0"/>

或适当的渲染转换:

<Ellipse Canvas.Top="20" Canvas.Left="40" Width="40" Height="40" Fill="Gray">
    <Ellipse.RenderTransform>
        <ScaleTransform ScaleY="-1"/>
    </Ellipse.RenderTransform>
</Ellipse>

为了反转整个画布坐标系的y方向,可以对画布应用渲染变换:

<Canvas ... RenderTransformOrigin="0,0.5">
    <Canvas.RenderTransform>
        <ScaleTransform ScaleY="-1"/>
    </Canvas.RenderTransform>
    ...
</Canvas>

...
编辑:您还可以将椭圆放置在另一个高度为零的画布中,并将其附着到画布下边框:

<Canvas Canvas.Top="20" Canvas.Left="40" Width="0" Height="0">
    <Ellipse Canvas.Bottom="0" Width="40" Height="40" Fill="Gray"/>
</Canvas>

我喜欢RenderTransform解决方案,因为我并不总是知道椭圆的高度,所以我无法用xaml设置边距。RenderTransform现在唯一的问题是它将整个椭圆翻转过来。有没有办法在不翻动的情况下做这件事?