【问题标题】:WPF RenderTransformWPF 渲染转换
【发布时间】:2013-07-05 13:04:31
【问题描述】:

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

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

我缺少一个属性吗?

【问题讨论】:

  • 我认为你应该在 canvas.Left 和 Canvas.top 上设置附加属性。

标签: c# wpf silverlight xaml rendertransform


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以使用转换器达到预期的效果:

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

    【讨论】:

      【解决方案3】:

      您可以使用Grid 而不是Canvas 作为椭圆的容器。所以与

      HorizontalAlignment="Center" VerticalAlignment="Center"
      

      您将获得位于Grid 中心的椭圆。

      【讨论】:

        【解决方案4】:

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

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

        我确信还有其他一些技巧可以做到这一点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多