2017-01-12 4 views
0

У меня есть целочисленный массив, объявленный в классе. Используя этот массив, PolyLine нарисована на сетке. Элементами массива являются y-координаты. Массив должен обновляться непрерывно, а затем значения должны отображаться. Моя идея реализовать это состоит в том, чтобы иметь два потока. Один для обновления значений массива, а другой для печати PolyLine в сетке. Обновление массива не является проблемой. Когда я пытаюсь распечатать PolyLine на сетке, используя приведенный ниже код, возникает исключение со следующим сообщением: «Вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток». Просьба предложить обходной путь для этой проблемы с помощью потока. Возможно, вместо потока можно использовать событие? Я открыт для предложений. Любая помощь приветствуется!Управление элементами WPF

public partial class MainWindow : Window 
{ 
    Polyline Wave = new Polyline(); 
    public MainWindow() 
    { 
     InitializeComponent(); 
     Refresh(); 
     DisplyOnGrid(); 
     ThreadStart child = new ThreadStart(DisplyOnGrid); 
     Thread _DisplayOnGrid = new Thread(child); 
     _DisplayOnGrid.Priority = ThreadPriority.Highest; 
     _DisplayOnGrid.Start(); 
    } 

    private void DisplyOnGrid() 
    { 
     Wave.Stroke = Brushes.Yellow; 
     Wave.StrokeThickness = 1.25; 
     for (int i = 0; i < DisplayGrid.Width; i++) 
     { 
      Wave.Points.Add(new Point(i, 50)); 
     } 
     DisplayGrid.Children.Add(Wave); 
    } 

    private void Refresh() 
    { 
     DisplayGrid.Children.Clear(); 
    } 
} 
+0

Почему вы удаления полилинии из сетки, а затем добавить снова? Вместо этого вы можете просто заменить свою коллекцию «Points». Кроме того, вы должны использовать диспетчер, как показано в ответе, или, возможно, вообще не использовать Thread, и вместо DispatcherTimer. – Clemens

ответ

2

Вы получаете ошибку, потому что вы пытаетесь получить доступ к объекту, который принадлежит UI/грузоотправитель нить попробовать что-то вроде этого:

private void DisplyOnGrid() 
{ 
    Dispatcher.Invoke(new Action(()=> 
    { 
    Wave.Stroke = Brushes.Yellow; 
    Wave.StrokeThickness = 1.25; 
    for (int i = 0; i < DisplayGrid.Width; i++) 
    { 
     Wave.Points.Add(new Point(i, 50)); 
    } 
    DisplayGrid.Children.Add(Wave); 
    } 

))}; 
Смежные вопросы