Кто-нибудь знает, как вернуть значение из Dispatcher
. Invoke
в wpf? Я хочу вернуть выбранный индекс для ComboBox.
Спасибо!
Кто-нибудь знает, как вернуть значение из Dispatcher
. Invoke
в wpf? Я хочу вернуть выбранный индекс для ComboBox.
Спасибо!
int result = -1;
// this is synchronous
myCombo.Invoke(() =>
{
result = myCombo.SelectedIndex;
});
return result;
Это, конечно, неловкое. Лучшим вариантом было бы реализовать INotifyPropertyChanged в вашей виртуальной машине, создать свойство SelectedIndex и связать с ним свойство SelectedIndex
вашего поля со списком. Связывание INPC не зависит от потоков (3.5 или 4.0+, я не помню), поэтому вы можете без проблем читать и обновлять эти свойства из разных потоков в вашей виртуальной машине.
Другой способ, который возвращает значение из Invoke():
object oIsLoaded = container.Dispatcher.Invoke( new Func<bool> ( () =>
{
return container.IsLoaded;
})
);
И, кстати, есть вероятность, что исходный код (который работает с делегатом) вообще не изменит oIsLoaded
; Поэтому я предпочел бы использовать Func<>
для возврата значения из этой функции.
Это мой метод для получения выбранного значения для combobox, как я могу сказать, что делегат возвращает значение?
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;
}
}
Я решил это. Решением является создание пользовательского делегата, который возвращает желаемый тип следующим образом:
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();
Вы не можете сделать это напрямую, но вы можете это сделать.
Dispatcher.Invoke() фактически возвращает возвращаемое значение из вызываемого делегата, поэтому соответствующим образом меняйте свой делегат.
Возвращаемое значение
Тип: System.Object Возвращаемое значение из вызываемого делегата или null, если делегат не имеет возврата значение.