【问题标题】:WPF element positioning on a Canvas画布上的 WPF 元素定位
【发布时间】:2010-09-10 03:38:24
【问题描述】:

我想在画布上放置一个椭圆。我希望椭圆的中心超过这一点。目前椭圆的最左上角已经超过了这个点。

我知道我可以在画布上以编程方式移动椭圆,但我想知道是否有办法告诉 WPF 将元素置于该点的中心,而不是从左上角调整它的大小???

【问题讨论】:

    标签: c# .net wpf canvas geometry


    【解决方案1】:

    我不知道 Ellipse 中有任何内置功能可以将其中心设置在一个点上,但您可以扩展 Ellipse 类来做到这一点。

    将此类添加到项目中

    public static class EllipseX 
    {
        public static void SetCenter(this Ellipse ellipse, double X, double Y)
        {
            Canvas.SetTop(ellipse, Y - ellipse.Height/2);
            Canvas.SetLeft(ellipse, X - ellipse.Width/2);
        }
    }
    

    然后在 xaml 中创建椭圆

    <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="350" Width="525">
       <Canvas Background="LightGray">
          <Ellipse      
              Name="myEllipse"      
              Fill="Red"
              Height="75"
              Width="75"
           />
       </Canvas>
    </Window>
    

    然后在后面的代码中写下 int 代码:

    myEllipse.SetCenter(200,200);
    

    这样做的好处是您不必重复在您创建的每个椭圆中寻找中心的逻辑。

    希望这会有所帮助。

    【讨论】:

    • 这可以通过在扩展方法中使用 Shape 代替 Ellipse 来更进一步。 public static void SetCenter(this Shape s, double X, double Y){...}
    【解决方案2】:

    不,没有这样的方法。左上角是左上角,因为它是左上角:)。或者,如果您知道椭圆尺寸,您可以移动点而不是移动椭圆。

    【讨论】:

      【解决方案3】:

      您可以将TranslateTransform 应用于椭圆,但这需要您知道它的宽度和高度。

      【讨论】:

        【解决方案4】:

        我在将 ScaleTransform 的中心设置为不同大小的控件样式时遇到了类似的问题。 最终使用转换器绑定到除以 2 的 ActualWidth/ActualHeight。正如 Rune Grimstad 提到的那样,使用 TranslateTransform 应该同样适用。

        <ScaleTransform CenterX="{Binding ActualWidth, Converter={StaticResource divisionConverter}}"
                        CenterY="{Binding ActualHeight, Converter={StaticResource divisionConverter}}"
                        ScaleX="1.2"
                        ScaleY="1.2" />
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-13
          • 1970-01-01
          • 2019-12-17
          • 1970-01-01
          • 2010-12-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多