【问题标题】:Use Ellipse with origin in the center WPF使用以中心 WPF 为原点的椭圆
【发布时间】:2013-10-29 17:20:01
【问题描述】:

我有一个程序,我可以在Canvas 面板中拖动、旋转和调整System.Windows.Shapes.Ellipse 的大小。

要在画布内调整椭圆的大小并将其拖动并始终保持居中,我需要在每次其原点时进行更正,因为椭圆的原点位于左上角。

有办法让Ellipse的原点默认居中吗?

拖动:

Canvas.SetTop(ellipse, newX - (ellipse.Height / 2));
Canvas.SetLeft(ellipse, newY - (ellipse.Width / 2));

调整大小:

ellipse.Height = newHeight;
ellipse.Width = newWidth;

旋转:

ellipse.RenderTransform = new RotateTransform(angle,(ellipse.Width/2),(ellipse.Height/2));

【问题讨论】:

  • 您是使用drawingContext绘制椭圆还是通过WPF内置控件绘制椭圆?
  • @RohitVats 带有内置控件,来自 Windows.System.Shapes

标签: c# wpf canvas ellipse


【解决方案1】:

如果宽度和高度是固定的,最简单的解决方案是将椭圆的RenderTransform 设置为TranslateTransform,同时将XY 设置为负偏移量,分别等于椭圆的宽度和高度的一半:

<Ellipse Width="100" Height="100" Fill="Red">
  <Ellipse.RenderTransform>
    <TranslateTransform X="-50" Y="-50" />
  </Ellipse.RenderTransform>
</Ellipse>

请注意,使用RenderTransform 的一个注意事项是转换不适用于布局(您不能将TranslateTransform 用于LayoutTransform)。这对于 Canvas 来说应该不是问题,因为它处理布局的方式,尽管它可能对其他面板有问题。

【讨论】:

  • 不起作用,当我拖动椭圆时,它仍然在原点的左上角。
  • 我没有注意到在您的原始帖子中您已经将RenderTransform 设置为RotateTransform。你要覆盖TranslateTransform 吗?如果您想同时设置两者,则需要使用TransformGroup
  • 另外,您可能需要设置RenderTransformOrigin="0.5,0.5" 才能绕椭圆中心旋转。
  • 难道没有办法更普遍地使用数据绑定来解决这个问题吗?
【解决方案2】:

您可以使用 Margin 属性。

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="600" Width="600">
    <Grid>
        <Canvas Width="300" Height="300">
            <Ellipse x:Name="ellipse" 
                     Canvas.Left="150" Canvas.Top="150" 
                     Width="50" Height="50" 
                     Margin="-25,-25" 
                     Stroke="Red"/>
        </Canvas>
    </Grid>
</Window>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-19
    • 2011-07-22
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多