如何以编程方式将简单形状绘制到WPF xaml定义的画布上

时间:2016-10-31 15:02:25

标签: c# wpf canvas

我正在从一个非常慢的WinForms应用程序移植(或尝试)遗留代码到WPF。 WinForms应用程序在渲染大图像时会失败,并且当用户平移时必须非常频繁地重新渲染,因此必须这样做。

我有一个系统可以在xaml中绘制画布,允许使用Border的自定义子项进行缩放和平移,在xaml中它被富有想象地命名为" canvas"。我有问题从其他类向画布绘制简单的省略号。

namespace ZoomPan
{   
    public class DisplayManager
    {
        protected void DrawIcon(Locale locale, Color color) 
        {
            Brush sensorBrush = new SolidColorBrush(color);
            Brush sensorOutline = new SolidColorBrush(Colors.Black);
            int x = locale.x;
            int y = locale.y;
            halfSize = 10;
            DrawEllipse(locale.Name, sensorBrush, sensorOutline, x - halfSize, y - halfSize, 2 * halfSize, 2 * halfSize);
        }   

        public void DrawEllipse(string name, Brush sensorBrush, Brush sensorPen, int x, int y, int width, int height)
        {
            double thickness = 5;

            Ellipse ellipse = new Ellipse();
            /* 
             Define ellipse 
            */
            canvas.Children.Add(ellipse);
        }
    }   
}   

这是我的第一次尝试,它会在最终的canvas.Children系列中引发错误,即"名称' canvas'在当前上下文中不存在"

我尝试将DrawEllipse移动到一个单独的类,这会引发不同的错误

namespace ZoomPan
{   
    public class DisplayManager
    {
        protected void DrawIcon(Locale locale, Color color) 
        {
            Brush sensorBrush = new SolidColorBrush(color);
            Brush sensorOutline = new SolidColorBrush(Colors.Black);
            int x = locale.x;
            int y = locale.y;
            halfSize = 10;
            DrawEllipse(locale.Name, sensorBrush, sensorOutline, x - halfSize, y - halfSize, 2 * halfSize, 2 * halfSize);
        }   
    }

    public class MainWindow : Window
    {
        public void DrawEllipse(string name, Brush sensorBrush, Brush sensorPen, int x, int y, int width, int height)
        {
            double thickness = 5;

            Ellipse ellipse = new Ellipse();
            /* 
             Define ellipse 
            */
            canvas.Children.Add(ellipse);
        }
    }   
}   

这些错误是在第一个类中对DrawEllipse的调用:

"名称' DrawEllipse'在当前背景下不存在"

当我添加MainWindow时。在DrawEllipse之前:

"非静态字段,方法或属性< ZoomPan.MainWindow.DrawEllipse(字符串,System.Windows.Media.Brush,System.Windows.Media.Brush)需要对象引用,int,int,int,int)'"

当我第一次使用WPF时,当DrawEllipse方法位于MainWindow.xaml.cs文件的公共类MainWindow:Window中时,我可以将它显示在画布上,因此上面的第二次尝试。

我觉得我错过了一些明显的东西,并且在网站上找不到任何确切的问题。

1 个答案:

答案 0 :(得分:0)

其他类需要传递canvas对象才能使用它。

通过构造函数将画布传递给DisplayManager一次,这样它就可以存储然后用于所有方法:

public class DisplayManager
{
    Canvas canvas;
    public DisplayManager(Canvas canvas)
    {
        this.canvas = canvas;
    }
}

或者每次将其作为第一个参数传递给每个方法:

public class DisplayManager
{
    public void DrawEllipse(Canvas canvas, string name, Brush sensorBrush, Brush sensorPen, int x, int y, int width, int height) 
    { 
    }
}