0

Ellipse在 a 的中心画一个Canvas。这样做时,左上角Ellipse实际上是在中心绘制的,但我希望 的中心点Ellipse在中心。为此,我认为我需要一个RenderTransform,但我无法让它正常工作。

<Ellipse Stroke="Red" RenderTransformOrigin="0.5,0.5" StrokeThickness="5" HorizontalAlignment="Center" VerticalAlignment="Center" Width="100" Height="100">

我错过了一个属性吗?

4

4 回答 4

1

您可以使用 aGrid而不是Canvas作为椭圆的容器。所以随着

HorizontalAlignment="Center" VerticalAlignment="Center"

你会得到你的椭圆在Grid定位的中心。

于 2013-07-09T09:47:33.733 回答
1

基本上你不能通过附加属性来做到这一点,除非你通过知道确切中心的 viewModel 绑定。您将需要使用后面的代码来找出画布的中心。喜欢:

myCanvas.SetLeft(elipse, (myCanvas.ActualWidth - elipse.ActualWidth) / 2);
myCanvas.SetTop(elipse, (myCanvas.ActualHeight - elipse.ActualHeight) / 2);
于 2013-07-05T13:10:21.917 回答
1

您可以使用转换器获得所需的结果:

xml:

<Window.Resources>
    <wpfApplication1:GetCentreConverter x:Key="CentreConverter"/>
</Window.Resources>
<Canvas x:Name="canvas">
    <Ellipse Stroke="Red"
             RenderTransformOrigin="0.5,0.5"
             StrokeThickness="5"
             Width="100"
             Height="100"
             Canvas.Left="{Binding ElementName=canvas, Path=ActualWidth, Converter={StaticResource CentreConverter}, ConverterParameter=50}"
             Canvas.Top="{Binding ElementName=canvas, Path=ActualHeight, Converter={StaticResource CentreConverter}, ConverterParameter=50}"/>
</Canvas>

转换器:

public class GetCentreConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var width = double.Parse(value.ToString());
        var offset = double.Parse(parameter.ToString());

        return width/2 - offset;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2013-07-05T13:41:09.093 回答
0

如 Vidas 所述,您需要使用Canvas.LeftCanvas.Top附加属性。

除了在代码隐藏中执行之外,您还可以编写自定义转换器,以便您可以在 XAML 中执行此操作。例如,如果您编写 DivideByTwoConverter,则可以将附加属性绑定到画布的宽度和高度,并在绑定上使用转换器。

我敢肯定还有其他一些技巧可以做到这一点。

于 2013-07-05T13:19:03.100 回答