34

任何人都知道如何从Dispatcher. Invoke中?我想返回ComboBox的选定索引。

谢谢!

4

5 回答 5

39

还有另一种从 Invoke() 返回值的方法:

object oIsLoaded = container.Dispatcher.Invoke( new Func<bool> ( () =>
    {
        return container.IsLoaded;
    })
);

顺便说一句,初始代码(与委托一起工作)可能根本不会修改oIsLoaded。所以我宁愿使用 aFunc<>从那种函数返回一个值。

于 2011-07-14T12:16:12.953 回答
31
int result = -1;

// this is synchronous
myCombo.Invoke(() => 
{
  result = myCombo.SelectedIndex;
});

return result;

当然,这有点笨拙。更好的设计是在您的 VM 中实现 INotifyPropertyChanged,创建一个 SelectedIndex 属性并将SelectedIndex您的组合框的属性绑定到它。INPC 绑定是线程不敏感的(3.5 或 4.0+,我不记得是哪个),因此您可以从 VM 中的不同线程读取和更新这些属性而无需担心。

于 2010-03-22T12:00:40.187 回答
2

这是我为组合框检索选定值的方法,我怎么能说委托返回值?

    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;
            }

    }
于 2010-03-22T12:07:30.920 回答
1

你不能直接这样做,但你可以这样做。

Dispatcher.Invoke() 实际上从您调用的委托返回返回值,因此请相应地更改您的委托。

返回值

类型:System.Object 正在调用的委托的返回值;如果委托没有返回值,则返回 null。

资源

于 2010-03-22T12:03:31.507 回答
1

我已经解决了这个问题。解决方案是创建一个自定义委托,该委托返回所需的类型,如下所示:

    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();
于 2010-03-22T12:38:26.747 回答