如何使用Dispatcher.Invoke返回值?

时间:2010-03-22 11:53:49

标签: wpf return invoke dispatcher

任何人都知道如何从Dispatcher中的Invoke返回一个值?我想返回ComboBox的所选索引。

谢谢!

5 个答案:

答案 0 :(得分:29)

int result = -1;

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

return result;

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

答案 1 :(得分:29)

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

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

顺便说一下,初始代码(使用委托代码)可能根本不会修改oIsLoaded;所以我宁愿用Func<>从这种函数中返回一个值。

答案 2 :(得分: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;
            }

    }

答案 3 :(得分:1)

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

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

  

返回值

     

类型:System.Object返回值   来自被调用的委托或   如果委托没有返回,则返回null   值。

Source

答案 4 :(得分: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();