我正在创建一个应用程序,我在该应用程序中使用计时器来更改WPF C#.NET中的标签内容。
在计时器已用完的事件中,我正在编写以下代码
lblTimer.Content = "hello";
但它抛出一个InvalidOperationException
并给出一条消息调用线程无法访问此对象,因为另一个线程拥有它。
我正在使用.NET framework 3.5和WPF与C#。
请帮帮我 提前谢谢。
答案 0 :(得分:11)
对于.NET 4.0,使用DispatcherTimer要简单得多。然后,事件处理程序在UI线程中,它可以直接设置控件的属性。
private DispatcherTimer updateTimer;
private void initTimer
{
updateTimer = new DispatcherTimer(DispatcherPriority.SystemIdle);
updateTimer.Tick += new EventHandler(OnUpdateTimerTick);
updateTimer.Interval = TimeSpan.FromMilliseconds(1000);
updateTimer.Start();
}
private void OnUpdateTimerTick(object sender, EventArgs e)
{
lblTimer.Content = "hello";
}
答案 1 :(得分:3)
lblTimer
在您的主要GUI线程中声明,并且您正尝试从其他线程更新它 - >你得到这个错误。
此link “在非UI线程上访问WPF控件”包含问题的说明及其修复。
答案 2 :(得分:1)
InvokeRequired在wpf中不起作用。
更新另一个线程拥有的GUI元素的正确方法是:
在模块级别声明:
delegate void updateLabelCallback(string tekst);
这是更新标签的方法:
private void UpdateLabel(string tekst)
{
if (label.Dispatcher.CheckAccess() == false)
{
updateLabelCallback uCallBack = new updateLabelCallback(UpdateLabel);
this.Dispatcher.Invoke(uCallBack, tekst);
}
else
{
//update your label here
}
}