【发布时间】: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)));
}
}
圆圈应该以双击窗口的点为中心;但是,上面代码绘制的圆圈在“双击点”的下方和右侧居中。如何解决这个问题?
编辑:myLabel 有 Height=350 和 Width=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 的回答。但是,我认为您还没有完全“钉牢”。圆圈没有被常数偏移;有关详细信息,请参阅我的问题的“编辑”部分。