【问题标题】:How to return a value with Dispatcher.Invoke?如何使用 Dispatcher.Invoke 返回值?
【发布时间】:2011-01-30 07:40:36
【问题描述】:

有人知道如何在 中从Dispatcher.Invoke 返回一个值吗?我想返回 ComboBox 的选定索引。

谢谢!

【问题讨论】:

    标签: wpf wpf return invoke dispatcher


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:
      int result = -1;
      
      // this is synchronous
      myCombo.Invoke(() => 
      {
        result = myCombo.SelectedIndex;
      });
      
      return result;
      

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

          返回值

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

          Source

          【讨论】:

          • 在上面我发布了我的 sn-p 代码,我该如何修改它以允许委托返回组合框的选定值?谢谢
          • Action 不允许返回值,在这种情况下,您将不得不使用类似@Will 的解决方案
          • Will 解决方案在 ComboBox WPF 控件中不起作用。我收到一个错误。
          【解决方案5】:

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

              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();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-09-06
            • 2011-02-17
            • 1970-01-01
            • 1970-01-01
            • 2022-07-11
            • 2017-09-05
            • 2020-03-20
            • 2016-01-30
            相关资源
            最近更新 更多