Доступ к контексту рисования в таймере диспетчера дает исключение
То, что я пытаюсь сделать, это сначала найти угол плечевого сустава до сих пор, мне удалось сделать это. То, что я хотел сделать сейчас, это когда угол находится в диапазоне между 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));
}));