我打算创建一个可以从(X1,Y1)点到(X2,Y2)绘制弧线的应用程序。
(X1,X2)是我在画布上点击的第一个点,(X2,Y2)是第一个点击后的第二个点。当第一次点击发生时,第一个圆弧点(X1,Y1)被保存,第二个圆弧点相对于鼠标指针,所以这样,我可以灵活地制作画布宽度,而在那里' SA&# 34; GHOST"在视频最终决定第二次点击之前,电弧会向用户显示如何制作电弧(不需要按住咔嗒声)。
A" GHOST"是开启时,比方说,电源点,你插入一条线,你 按住第一次单击,然后移动鼠标,结束点 在线上看起来像是连接到鼠标指针,直到 左键单击已释放。它在视觉上就像一条线,但在你释放你的点击之前 这条线不是""画的"并且仍然可以灵活调整。
然而,Y2,IS始终与Y1相等,这意味着弧线始终位于两侧的相同Y.
这是我的XAML:
<Window x:Class="Drawing.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">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBox Grid.Row="0" Height="25" IsEnabled="False" Name="txt" Grid.ColumnSpan="2"/>
<TextBox Grid.Column="0" Grid.Row="1" Width="100"/>
<Canvas Name="cnv" MouseLeftButtonDown="cnv_MouseLeftButtonDown" Background="Transparent" Grid.Row="1"
Grid.Column="1" MouseMove="cnv_MouseMove"/>
</Grid>
</Window>
这是我的MainWindow课程:
Ellipse ellipse = null;
public MainWindow()
{
InitializeComponent();
}
private void cnv_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Point p = Mouse.GetPosition(cnv);
txt.Text = p.ToString();
if (ellipse == null)
{
Point first = p;
ellipse = new Ellipse();
ellipse.Fill = Brushes.Transparent;
ellipse.Stroke = Brushes.Black;
ellipse.StrokeThickness = 1;
Canvas.SetTop(cnv, p.Y);
Canvas.SetLeft(cnv, p.X);
ellipse.Width = p.X - Canvas.GetLeft(ellipse);
ellipse.Height = 20;
ellipse.Clip = new RectangleGeometry(new Rect(0, ellipse.Height / 2, ellipse.Width, ellipse.Height));
cnv.Children.Add(ellipse);
}
else
{
ellipse = null;
}
}
private void cnv_MouseMove(object sender, MouseEventArgs e)
{
Point p = Mouse.GetPosition(cnv);
txt.Text = p.ToString();
if (ellipse != null)
{
ellipse.Width = p.X - Canvas.GetLeft(ellipse);
ellipse.Height = 20;
ellipse.Clip = new RectangleGeometry(new Rect(0, ellipse.Height / 2, ellipse.Width, ellipse.Height));
}
}
知道如何解决这个问题吗?
P.S。我不是严格修剪椭圆,如果你能告诉我另一种方法,那很好。但是,我坚持在代码隐藏上而不是在XAML上执行此操作。
P.S.S。
,只能在第二次点击后编辑我的弧线。P.S.S.S。在我画弧之前,我用相同的方法绘制了一条线,它的工作正常。线上的差异有X1,Y2,X2,Y2而椭圆没有(我认为问题出在哪里,但我无法解决如何修复它。也许我错了)< / p>
P.S.S.S.S。额外的怪异:当第一次点击发生时,我的画布左上方会出现一条黑线,但是当我移动鼠标时,线条消失了。我不知道那是什么。
由于
答案 0 :(得分:1)
您必须在椭圆上设置Canvas.Left
和Canvas.Top
,而不是在画布上。
在cnv_MouseLeftButtonDown
更改
Canvas.SetTop(cnv, p.Y);
Canvas.SetLeft(cnv, p.X);
到
Canvas.SetTop(ellipse, p.Y);
Canvas.SetLeft(ellipse, p.X);
另一个错误是cnv_MouseMove
,表达式
ellipse.Width = p.X - Canvas.GetLeft(ellipse);
当鼠标指针向左移动超出起点时,尝试为椭圆指定负宽度。
答案 1 :(得分:0)
我不太确定我是否理解你是如何指定弧线的,但是我使用以下代码为我的程序绘制了一个圆弧(更像是一个饼图)(也许你会找到一些你可以使用的东西这里):
OrientSegment = new PathGeometry();
PathFigure figure = new PathFigure();
//Offset is used to convert from clock face radians (starting at top) to system radians (off by 90 degrees, or Tau/4)
double offset = -IRMath.Tau / 4;
Point start = new Point(radius * Math.Cos(minRadians + offset), radius * Math.Sin(minRadians + offset));
Point end = new Point(radius * Math.Cos(minRadians + offset + radianSpan), radius * Math.Sin(minRadians + offset + radianSpan));
figure.StartPoint = new Point(0, 0);
figure.Segments.Add(new LineSegment(start, false));
figure.Segments.Add(new ArcSegment(end, new Size(radius, radius), 0, radianSpan > Math.PI, SweepDirection.Clockwise, true));
figure.Segments.Add(new LineSegment(figure.StartPoint, false));
OrientSegment.Figures.Add(figure);
只有一行XAML:
<Path x:Name="SegmentPath" Data="{Binding OrientSegment, ElementName=root}" Canvas.Left="30" Canvas.Top="30" Fill="{Binding SegmentBrush, ElementName=root}" Stroke="{DynamicResource OrientationSegmentStroke}" StrokeThickness="4"/>