除非从MainWindow()调用Draw方法,否则无法在Canvas上绘制

时间:2017-05-08 17:05:27

标签: c# wpf canvas

我正在为一款热门游戏制作散热工具,而且我试图将这些东西画到画布上。

简而言之: 我有一个列表点(坐标,颜色),我打算在画布上绘制。它们是一系列无关紧要的东西的结果,但最后我必须将点列表传递给DrawPoints()方法,以便将它们可视化。

然而,在这样做时,我看不到任何被绘制的东西(包括SetMapImage())。它确实与我在方法本身中随机创建的虚拟点一起工作,但前提是我从public MainWindow()方法调用它。 试图从另一个类的方法中调用它......

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

......不会产生结果。 (假设方法正确连接)

我开始使用WPF毫无准备地制作我的工具,它确实回来困扰我。我不知道是什么导致了这种行为,可能是因为我不了解一些基本的东西,但我甚至不知道从哪里开始阅读。任何意见都值得赞赏,但请记住,我对这个主题不太熟悉。

This is what it looks like when it's working properly. Otherwise, I just see the Canvas background color.

相关方法如下所示。

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;
        }

1 个答案:

答案 0 :(得分:0)

显然,除非你实际显示新窗口,否则创建一个新的MainWindow实例并在该新实例上调用该方法无效。

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

因此,您应该替换

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

通过

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