我试图从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; }));
答案 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);