34

から値を返す方法は誰でも知っていますDispatcherInvokeで?ComboBoxの選択したインデックスを返したいです。

ありがとう!

4

5 に答える 5

39

Invoke() から値を返す別の方法があります。

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

ちなみに、最初のコード (デリゲートで動作する) はまったく変更oIsLoadedされない可能性があります。Func<>したがって、そのような関数から値を返すにはa を使用したいと思います。

于 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 に答える