System.InvalidOperationException при рисовании в HelixViewPort3D - PullRequest
0 голосов
/ 29 ноября 2018

Всегда, когда я хочу рисовать в ViewPort3D из процесса, я получаю исключение System.InvalidOperationException.Что я не понимаю?Процесс не может получить доступ к процессу пользовательского интерфейса?Как я могу решить эту проблему?

        private void Pro_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        Random r = new Random();
        DrawSphere(counter, Colors.Red, (double)r.Next(400) / 100);
        counter++;
    }

    private void DrawSphere(int i, Color color, double radius)
    {
        SphereVisual3D sphere = new SphereVisual3D();
        sphere.Center = new Point3D(i * 5, counter * 5, 0);
        sphere.Visible = true;
        sphere.Fill = new SolidColorBrush(color);
        sphere.Radius = radius;
        viewPort.Children.Add(sphere);
    }

1 Ответ

0 голосов
/ 29 ноября 2018

Вам необходимо использовать диспетчер для проверки доступа.У вас есть 2 варианта: Первый вариант:

private void Pro_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        Random r = new Random();
        Application.Current.Dispatcher.Invoke(new Action(() => DrawSphere(counter, Colors.Red, (double)r.Next(400) / 100)));
        counter++;
    }

Второй вариант:

        private void Pro_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        Random r = new Random();
        DrawToViewPort(counter, Colors.Red, (double)r.Next(400) / 100);
        counter++;

    }

    private void DrawToViewPort(int i, Color color, double radius)
    {
        if (viewPort.Dispatcher.CheckAccess())
        {
            DrawSphere(i, color, radius);
        }
        else
        {
            viewPort.Dispatcher.Invoke((Action<int, Color, double>)DrawToViewPort, i, color, radius);
        }
    }
...