Доступ к контексту рисования в таймере диспетчера дает исключение

То, что я пытаюсь сделать, это сначала найти угол плечевого сустава до сих пор, мне удалось сделать это. То, что я хотел сделать сейчас, это когда угол находится в диапазоне между 70 и 90, время начинается в течение 3 секунд и в Каждую секунду он должен проверять, находится ли угол по-прежнему в диапазоне, если он затем отображается на экране, в противном случае перезапустите таймер после отображения сообщения, которое вы еще не завершили. Пожалуйста, имейте в виду, что вы новичок в C# и помогите в любой помощи в В этом отношении будет полезна ссылка на изображение проблемы, с которой они сталкиваются: http://i46.tinypic.com/2nu4ygw.jpg

Пожалуйста помоги!!

       System.Windows.Point shoul_l = this.point_toScreen(sh_left.Position, sen);
        draw.DrawText(new FormattedText(angle.ToString("0"), new 
        System.Globalization.CultureInfo("en-us"),
          System.Windows.FlowDirection.LeftToRight,
         new Typeface("Verdana"), 16,System.Windows.Media.Brushes.OrangeRed),
         new System.Windows.Point(shoul_l.X+10, shoul_l.Y +20));

        if (timer_start == false)
        {
        if (angle > 70 && angle < 90)
        {
                timer_start = true;
                timer.Interval = 2000;
                timer.Start();
                timer.Elapsed += new ElapsedEventHandler((sender, e) =>   \    
                on_time_event(sender, e, draw,shoul_l));

        }
        }


}   
void on_time_event(object sender, ElapsedEventArgs e, DrawingContext dcrt, 

 System.Windows.Point Shoudery_lefty)
 {
     --index;
     if (index != 0)
     {
         dcrt.DrawText(new FormattedText(index.ToString(), new   
      System.Globalization.CultureInfo("en-us"),
           System.Windows.FlowDirection.LeftToRight,
          new Typeface("Verdana"), 16, System.Windows.Media.Brushes.OrangeRed),
          new System.Windows.Point(Shoudery_lefty.X+50,Shoudery_lefty.Y+50));
      //  MessageBox.Show(index.ToString());
     }
     else
     {
         timer.Stop();
     }
   }

я получаю исключение в этой части кода

      dcrt.DrawText(new FormattedText(index.ToString(), new   
      System.Globalization.CultureInfo("en-us"),
      System.Windows.FlowDirection.LeftToRight,
      new Typeface("Verdana"), 16, System.Windows.Media.Brushes.OrangeRed),
      new System.Windows.Point(Shoudery_lefty.X+50,Shoudery_lefty.Y+50));

1 ответ

Решение

Вы пытаетесь обновить элемент пользовательского интерфейса из Timer нить. Это не разрешено
Вы должны перенаправить вызов обновления пользовательского интерфейса в поток пользовательского интерфейса, используя Dispatcher как это:

dcrt.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => 
    {
        dcrt.DrawText(new FormattedText(index.ToString(), new System.Globalization.CultureInfo("en-us"),
       System.Windows.FlowDirection.LeftToRight,
      new Typeface("Verdana"), 16, System.Windows.Media.Brushes.OrangeRed),
      new System.Windows.Point(Shoudery_lefty.X+50,Shoudery_lefty.Y+50));
    }));
Другие вопросы по тегам