【问题标题】:Cannot draw on Canvas unless Draw method is called from MainWindow()除非从 MainWindow() 调用 Draw 方法,否则无法在 Canvas 上绘图
【发布时间】: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 用于输出图像的方便和可见性之外,但在程序本身中,画布位于视图框内。

标签: c# wpf canvas


【解决方案1】:

显然,除非您实际显示新窗口,否则创建一个新的 MainWindow 实例并在该新实例上调用该方法没有任何效果。

虽然您的问题不是很清楚,但您可能希望在已经存在(并显示)的 MainWindow 实例上调用该方法。

因此你应该替换

MainWindow mainWindow = new MainWindow();
mainWindow.DrawPoints(listOfPointsToDraw);

通过

MainWindow mainWindow = (MainWindow)Application.Current.MainWindow;
mainWindow.DrawPoints(listOfPointsToDraw);

【讨论】:

  • 这解决了问题。既然您指出了这一点,这很明显,但是由于我对 WPF 的了解不足,我设法忽略了这一点。我知道 cmets 不是为了感谢,但非常感谢!这为我密封了整个应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 2013-05-21
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多