から値を返す方法は誰でも知っていますDispatcher
。wpfInvoke
で?ComboBoxの選択したインデックスを返したいです。
ありがとう!
から値を返す方法は誰でも知っていますDispatcher
。wpfInvoke
で?ComboBoxの選択したインデックスを返したいです。
ありがとう!
Invoke() から値を返す別の方法があります。
object oIsLoaded = container.Dispatcher.Invoke( new Func<bool> ( () =>
{
return container.IsLoaded;
})
);
ちなみに、最初のコード (デリゲートで動作する) はまったく変更oIsLoaded
されない可能性があります。Func<>
したがって、そのような関数から値を返すにはa を使用したいと思います。
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();