【发布时间】:2017-05-08 17:05:26
【问题描述】:
我正在为一款流行游戏构建热散射工具,但在尝试将事物绘制到画布上时遇到了问题。
简而言之:
我有一个我打算在画布上绘制的列表点(坐标、颜色)。它们是一长串不相关的东西的结果,但最后我必须将点列表传递给 DrawPoints() 方法,以便将它们可视化。
但是,这样做后,我看不到任何被绘制的东西(包括 SetMapImage())。它确实适用于我在方法本身中随机创建的虚拟点,但前提是我从 public MainWindow() 方法中调用它。
试图从另一个类的方法中调用它......
MainWindow mainWindow = new MainWindow();
mainWindow.DrawPoints(listOfPointsToDraw);
...不会产生结果。 (假设方法连接正确)
我毫无准备地使用 WPF 制作我的工具,但它确实回来困扰着我。我不知道是什么导致了这种行为,可能是因为我不了解基本的东西,但我什至不知道从哪里开始阅读。非常感谢任何意见,但请记住,我对主题不太熟悉。
相关方法如下所示。
public MainWindow()
{
InitializeComponent();
DrawPoints(); // Calling this from here draws the background image and the dummy points
// Calling it from elsewhere draws nothing
}
...
public void DrawPoints()
{
SetMapImage();
DrawingVisual dv = new DrawingVisual();
using (DrawingContext dc = dv.RenderOpen())
{
Random rand = new Random();
for (int i = 0; i < 200; i++)
dc.DrawRectangle(Brushes.Red, null, new Rect(rand.NextDouble() * 4500, rand.NextDouble() * 4500, 10, 10));
for (int i = 0; i < 20; i++)
{
dc.DrawRectangle(Brushes.Red, null, new Rect(100 * i , 100 * i, 100, 100));
}
}
RenderTargetBitmap rtb = new RenderTargetBitmap(4500, 4500, 96, 96, PixelFormats.Pbgra32);
rtb.Render(dv);
Image img = new Image();
img.Source = rtb;
img.IsHitTestVisible = false;
drawCanvas.Children.Add(img);
}
设置背景。
private void SetMapImage()
{
ImageBrush ib = new ImageBrush();
ib.ImageSource = new BitmapImage(new Uri(@"C:\Local Projects\CSGO Gamejam\MirageMinimapWhite.png", UriKind.Relative));
drawCanvas.Background = ib;
}
【问题讨论】:
-
我看不出你的 DrawPoints() 方法有什么问题(除了我的屏幕不是 4500x4500)。我连接了一个按钮来调用 DrawPoints(),每次单击它都会起作用。不过,我还添加了对 drawCanvas.Children.Clear() 的调用,以从画布中删除前一个图像。在您的第一个代码块中,为什么要创建一个新的 MainWindow 对象?你真的有多个可见的窗口吗?您的示例中可能已将其省略,但我没有看到任何代码来实际显示新创建的窗口。
-
是的,感谢您指出这一点。由于此错误,它确实引发了几次内存不足异常。除了 4500x4500 用于输出图像的方便和可见性之外,但在程序本身中,画布位于视图框内。