从另一个线程读取Checkbox状态

时间:2012-02-13 19:41:54

标签: c# wpf multithreading

我试图从WPF中的BackgroundWorker中读取复选框的值:

这不起作用:

bool? isSleepChecked = checkBoxSleep.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate{ return checkBoxSleep.IsChecked;});

无法将匿名方法转换为委托类型'System.Threading.ThreadStart',因为块中的某些返回类型不能隐式转换为委托返回类型

编辑 - 这是HB使用委托代替lambda表达的答案,我觉得它更具可读性

bool? isSleepChecked = (bool?)checkBoxSleep.Dispatcher.Invoke(new Func<bool?>(delegate { return checkBoxSleep.IsChecked; }));

2 个答案:

答案 0 :(得分:6)

改为分配变量,然后您不需要return

bool? isSleepChecked;
checkBoxSleep.Dispatcher.Invoke(new Action(
    () => isSleepChecked = checkBoxSleep.IsChecked));

或者,您可以使用具有返回值的委托(例如Func<T>):

bool? isSleepChecked = checkBoxSleep.Dispatcher.Invoke(new Func<bool?>(
                            () => checkBoxSleep.IsChecked));

(需要在.NET 4.5之前转换类型)

答案 1 :(得分:2)

您的代码无法编译,因为在您尝试从代理中返回bool?时,ThreadStart的返回类型为void

在这种情况下最简单的方法可能是在lambda表达式中捕获isSleepChecked变量并直接设置它:

bool? isSleepChecked = null;
checkBoxSleep.Dispatcher.Invoke(new Action(() =>
{ 
    isSleepChecked = checkBoxSleep.IsChecked; 
}), 
    DispatcherPriority.Normal);