Нитки з інтерфейсом користувача (Canvas)

Я намагаюся створити нитку для перемальовування функції мого існуючого полі-малюнок. Я читав тут можливо, що UI можна реалізувати в Threads див. Тут LINK , але я не можу використовувати його на моїй функції redrawSingelPoly() .... Будь-які ідеї, як я можу використовувати redrawSingelPoly() як потік?

У моєму MainWindow.xaml.cs:

Викликається, коли користувач натискає кнопку на моєму головному вікні:

    private void SingleSelectedMeasurement(object sender, RoutedEventArgs e)
    {
        System.Windows.Controls.Button button = (System.Windows.Controls.Button)sender;
        RedrawSingelMeasurement(Convert.ToInt16(button.Tag));
    }

    private void RedrawSingelMeasurement(int selectedMeasurement)
    {
        selectedMeasurement = selectedMeasurement - 1;

        for (int i = 0; i < measurements.Length; i++)
        {
            if (selectedMeasurement != i) 
            {
                measurements[i].draw = false; //block drawing
            }
            else
            {
                measurements[i].draw = true;//remove block for drawing
            }
        }
            measurements[selectedMeasurement].redrawSingelPoly(); 
    }

У моєму Measurement.cs:

    public void redrawSingelPoly() 
    {
        Polyline poly = new Polyline();
        poly.Stroke = colorBrush; 
        poly.StrokeThickness = basicLineThick;

        //first clean all
        coordinateSystem.Children.Clear(); 

        poly.Points = points;
        //draw
        coordinateSystem.Children.Add(poly);
    }
0
Оберніть метод в делегаті Action і передайте його диспетчеру інтерфейсу користувача.
додано Автор PoweredByOrange, джерело

7 Відповіді

В ідеалі тільки одне вікно може працювати на одному диспетчері, однак ви можете розмістити різні візуальні ефекти в різних потоках через HostVisual, але в дуже обмежених сценаріях. Можливо, ця стаття допоможе вам:

http://blogs.msdn.com /b/dwayneneed/archive/2007/04/26/multithreaded-ui-hostvisual.aspx

0
додано

В ідеалі тільки одне вікно може працювати на одному диспетчері, однак ви можете розмістити різні візуальні ефекти в різних потоках через HostVisual, але в дуже обмежених сценаріях. Можливо, ця стаття допоможе вам:

http://blogs.msdn.com /b/dwayneneed/archive/2007/04/26/multithreaded-ui-hostvisual.aspx

0
додано
private void SingleSelectedMeasurement(object sender, RoutedEventArgs e)
{
    var button = (System.Windows.Controls.Button)sender;

    Task.Factory.StartNew (
      () => OnUi(RedrawSingelMeasurement(Convert.ToInt16(button.Tag))));        
}

//here's a sample on how to get despatcher for the ui thread
private void OnUi (Action action)
    {
        if (_dispatchService == null) 
            _dispatchService = ServiceLocator.Current.GetInstance();
            //or _dispatchService  = Application.Current.Dispatcher - whatever is suitable

        if (_dispatchService.CheckAccess())
            action.Invoke ();
        else
            _dispatchService.Invoke(action);
    }
0
додано
Як я оголошу цей _dispatchService?
додано Автор user2261524, джерело

Ви не можете отримати доступ до DependencyProperties з DependencyObject (у вашому випадку: координатної системи) з потоку, відмінного від того, з яким він пов'язаний.

Якщо ви хочете прискорити роботу програми, вам слід створити власний елемент керування, перевизначити його метод OnRender і намалювати власну графіку: вона видалить багато логіки логічного і візуального дерева і працюватиме набагато швидше.

0
додано

Ви не можете отримати доступ до DependencyProperties з DependencyObject (у вашому випадку: координатної системи) з потоку, відмінного від того, з яким він пов'язаний.

Якщо ви хочете прискорити роботу програми, вам слід створити власний елемент керування, перевизначити його метод OnRender і намалювати власну графіку: вона видалить багато логіки логічного і візуального дерева і працюватиме набагато швидше.

0
додано

Що про статтю, про яку ви згадуєте, говорять, насправді має лише один потік для кожного вікна . Малювання виділених елементів в іншому потоці неможливе.

0
додано

Що про статтю, про яку ви згадуєте, говорять, насправді має лише один потік для кожного вікна . Малювання виділених елементів в іншому потоці неможливе.

0
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug