【发布时间】:2011-01-30 07:40:36
【问题描述】:
有人知道如何在wpf 中从Dispatcher.Invoke 返回一个值吗?我想返回 ComboBox 的选定索引。
谢谢!
【问题讨论】:
标签: wpf wpf return invoke dispatcher
有人知道如何在wpf 中从Dispatcher.Invoke 返回一个值吗?我想返回 ComboBox 的选定索引。
谢谢!
【问题讨论】:
标签: wpf wpf return invoke dispatcher
还有另一种从 Invoke() 返回值的方式:
object oIsLoaded = container.Dispatcher.Invoke( new Func<bool> ( () =>
{
return container.IsLoaded;
})
);
顺便说一句,初始代码(与委托一起工作)可能根本不会修改oIsLoaded;所以我宁愿使用Func<> 从那种函数返回一个值。
【讨论】:
int result = -1;
// this is synchronous
myCombo.Invoke(() =>
{
result = myCombo.SelectedIndex;
});
return result;
当然,这有点笨拙。更好的设计是在 VM 中实现 INotifyPropertyChanged,创建 SelectedIndex 属性并将组合框的 SelectedIndex 属性绑定到它。 INPC 绑定是线程不敏感的(3.5 或 4.0+,我不记得是哪个),因此您可以从 VM 中的不同线程读取和更新这些属性而无需担心。
【讨论】:
这是我为组合框检索选定值的方法,我如何说委托返回值?
private object getValueCB(System.Windows.Controls.ComboBox cb)
{
object obj;
if (!cb.Dispatcher.CheckAccess())
{
obj = cb.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{
obj = cb.SelectedValue;
}
));
return obj;
}
else
{
return obj = cb.SelectedValue;
}
}
【讨论】:
你不能直接这样做,但你可以这样做。
Dispatcher.Invoke() 实际上从您调用的委托返回返回值,因此请相应地更改您的委托。
返回值
类型:System.Object 返回值 从被调用的委托或 如果委托没有回报,则为 null 价值。
【讨论】:
我已经解决了这个问题。解决方案是创建一个返回所需类型的自定义委托,如下所示:
private object GetValueCB(System.Windows.Controls.ComboBox cb)
{
object obj = null;
if (!cb.Dispatcher.CheckAccess())
{
obj = cb.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
(MyDelegate)
delegate()
{
return (obj = cb.SelectedValue);
}
);
return obj;
}
else
{
return obj = cb.SelectedValue;
}
}
public delegate object MyDelegate();
【讨论】: