我正在从一个非常慢的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中时,我可以将它显示在画布上,因此上面的第二次尝试。
我觉得我错过了一些明显的东西,并且在网站上找不到任何确切的问题。
答案 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)
{
}
}