WPF RenderTransform

Я рисую Ellipse в центре Canvas, При этом верхний левый угол Ellipse на самом деле рисуется в центре, но я хочу центральную точку Ellipse быть в центре. Для этого я предполагаю, что мне нужна RenderTransform но я не могу заставить его работать правильно.

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

Я пропускаю атрибут?

4 ответа

Вы можете достичь желаемого результата с помощью конвертера:

Xaml:

<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();
    }
}

Вы могли бы использовать Grid вместо Canvas as the container of the ellipse. So with

HorizontalAlignment="Center" VerticalAlignment="Center"

you will get your ellipse in the center of the Grid расположен.

По сути, вы не можете сделать это с помощью прикрепленных свойств, если вы не привязываетесь через viewModel, которая знает точный центр. Вам нужно будет использовать код, чтобы узнать центр холста. Подобно:

myCanvas.SetLeft(elipse, (myCanvas.ActualWidth - elipse.ActualWidth) / 2);
myCanvas.SetTop(elipse, (myCanvas.ActualHeight - elipse.ActualHeight) / 2);

Вы должны использовать вложенные свойства Canvas.Left и Canvas.Top, как указано в Vidas.

В дополнение к выполнению этого кода, вы также можете написать собственный конвертер, чтобы сделать это в XAML. Например, если вы напишите DivideByTwoConverter, вы можете привязать прикрепленные свойства к ширине и высоте холста и использовать конвертер для привязок.

Я уверен, что есть и другие приемы, чтобы сделать то же самое.

Другие вопросы по тегам