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, вы можете привязать прикрепленные свойства к ширине и высоте холста и использовать конвертер для привязок.
Я уверен, что есть и другие приемы, чтобы сделать то же самое.