【问题标题】:Drawing circles in WPF在 WPF 中绘制圆圈
【发布时间】:2011-06-28 14:09:15
【问题描述】:

我正在尝试编写一个 WPF 应用程序,您可以在其中通过双击在窗口上绘制圆圈。到目前为止,我有这个代码:

public class ShapeAdorner : Adorner
{
    private readonly Ellipse _circle;

    public ShapeAdorner(UIElement adornedElement, Point circleCenter)
        : base(adornedElement)
    {
        _circle = new Ellipse
        {
            Width = 10,
            Height = 10,
            Stroke = Brushes.Black,
            StrokeThickness = 1.5
        };
        _circle.Margin =
            new Thickness(left: circleCenter.X, top: circleCenter.Y, right: 0, bottom: 0);
        base.AddVisualChild(_circle);
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        _circle.Arrange(new Rect(finalSize));
        return finalSize;
    }

    protected override Size MeasureOverride(Size constraint)
    {
        _circle.Measure(constraint);
        return constraint;
    }

    protected override Visual GetVisualChild(int index)
    {
        return _circle;
    }

    protected override int VisualChildrenCount
    {
        get { return 1; }
    }
}

这是客户端代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(myLabel);
        adornerLayer.Add(new ShapeAdorner(adornedElement: myLabel, circleCenter: e.GetPosition(myLabel)));
    } 
}

圆圈应该以双击窗口的点为中心;但是,上面代码绘制的圆圈在“双击点”的下方和右侧居中。如何解决这个问题?

编辑:myLabelHeight=350Width=525。假设我双击点(X,Y);然后圆圈被绘制在((350+X)/2,(525+Y)/2)

编辑 2:为了完整起见,这里是 .xaml 文件:

<Window x:Class="Adorners.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Adorners project" Height="350" Width="525" MouseDoubleClick="Window_MouseDoubleClick">
    <Grid>
        <Label Name="myLabel" Content="my label" Background="Red"></Label>
    </Grid>
</Window>

【问题讨论】:

  • 真的太靠左了吗?如果你不补偿圆形尺寸,它应该在最右边。如果它真的在最右边,你应该在两个维度上使用减法,否则使用我的 awnser
  • 我的错误 - 我已将其更正为“正确”。
  • 感谢 Kent Boogaart, H.B. 和 aL3891 的回答。但是,我认为您还没有完全“钉牢”。圆圈没有被常数偏移;有关详细信息,请参阅我的问题的“编辑”部分。

标签: c# wpf shape adorner


【解决方案1】:

在设置边距的地方,您必须从顶部和左侧属性中减去半径以偏移圆。

【讨论】:

    【解决方案2】:

    您需要偏移圆的宽度/高度的一半。在此处进行硬编码以便于理解:

    AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(myLabel);
    var point = e.GetPosition(myLabel);
    point.X -= 5;
    point.Y -= 5;
    adornerLayer.Add(new ShapeAdorner(myLabel, point));
    

    【讨论】:

      【解决方案3】:

      设置边距时需要考虑宽度和高度。顶部应该是中心位置减去高度的一半,左侧也是如此:

      new Thickness(
           left: circleCenter.X + (_circle.Width/2), //farther to the right
           top: circleCenter.Y - (_circle.Height/2), //higher up
           right: 0, bottom: 0);
      

      【讨论】:

      • 原来它实际上是在最右边,而不是在左边。所以减法应该像在其他所有人的 awnser 中一样在两个维度上使用:)
      【解决方案4】:

      前面的答案是正确的。但是,主要问题是我省略了这两行:

      _circle.HorizontalAlignment = HorizontalAlignment.Left;
      _circle.VerticalAlignment = VerticalAlignment.Top;

      默认值Stretch造成了巨大的偏移误差。

      【讨论】:

        猜你喜欢
        • 2014-04-11
        • 2012-09-19
        • 1970-01-01
        • 1970-01-01
        • 2015-01-31
        • 1970-01-01
        • 2021-10-15
        • 2018-08-29
        相关资源
        最近更新 更多