Arc没有在wpf画布上显示?

时间:2014-05-20 19:18:32

标签: c# wpf canvas draw

我打算创建一个可以从(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。额外的怪异:当第一次点击发生时,我的画布左上方会出现一条黑线,但是当我移动鼠标时,线条消失了。我不知道那是什么。

由于

2 个答案:

答案 0 :(得分:1)

您必须在椭圆上设置Canvas.LeftCanvas.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"/>