在画布上点击的点上绘制一个矩形wpf

时间:2013-02-14 23:22:52

标签: wpf

在这里失去理智。我花了最近几天在WinForms中编写Windows应用程序的开头...昨天做了90度转弯并且出于审美原因不得不切换到WPF。转换某些东西时遇到了一些麻烦......即任何与图形有关的东西。在wpf版本中,我有以下C#代码在用户点击面板的位置创建一个黑色圆圈和白色矩形,并显示一个显示x坐标的消息框:

Graphics g;

private void panel1_MouseClick(object sender, MouseEventArgs e)
    {
        SolidBrush s2 = new SolidBrush(Color.Black);
        g.FillRectangle(s2, e.X + 3, e.Y + 3, 10, 10);
        SolidBrush s = new SolidBrush(Color.White);
        g.FillPie(s, e.X + 4, e.Y + 4, 7, 7, 0, 360);

        float x_cord = e.X;
        MessageBox.Show("X is:  " + x_cord.ToString());
    }

我尝试通过以下代码在wfb中执行此操作:

 Graphics g;
    private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        System.Windows.Point position = e.GetPosition(this);
        double pX = position.X;
        double pXint = Convert.ToInt32(pX);
        MessageBox.Show(pX.ToString());
        SolidBrush s2 = new SolidBrush(System.Drawing.Color.Black);
        g.FillRectangle(s2, pXint, 5, 10, 10);
    }

这个编译并正确运行但是当我点击画布时,没有任何反应!消息框主要是作为测试来查看事件是否完全触发,但显然不是。这是窗口中带有画布的相应XML:

<Grid>
        <Canvas Name="Surface" Height="Auto" Width="Auto" Background="White"> </Canvas>
    </Grid>

我在这里做错了什么?我实际上在大多数情况下更喜欢WPF,但某些事情是绝对令人讨厌的。

2 个答案:

答案 0 :(得分:2)

问题是你试图将System.Drawing个对象绘制到WPF Canvas上,你不能这样做。

解决此问题的一种方法是向Rectangles添加Canvas

<Grid>
    <Canvas Name="Surface" Height="Auto" Width="Auto" Background="White" MouseLeftButtonDown="Surface_MouseLeftButtonDown"></Canvas>
</Grid>


private void Surface_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Rectangle rect = new Rectangle { Width = 10, Height = 10, Fill = Brushes.Black };
    Surface.Children.Add(rect);
    Canvas.SetLeft(rect, e.GetPosition(this).X);
    Canvas.SetTop(rect, e.GetPosition(this).Y);
}

答案 1 :(得分:1)

知道了。我不相信我花了6个小时画一个矩形。不完全确定是什么使它工作,但认为它必须做一些摆脱using System.Drawing;当我尝试sa_ddam213的代码我得到一个错误说&#34;无法从System.Drawing.Rectangle转换为System.Windows.UIElement&#34;原因不明。谷歌搜索号码5007后,我发现了这篇文章:

http://msdn.microsoft.com/en-us/library/ms747393.aspx

我之前看过它但是无法获取为该行或elipse编译的代码,我认为是System.Drawing程序集导致问题。

非常感谢所有人的帮助!!