#wpf #c#-4.0
#wpf #c #-4.0
Вопрос:
Я нашел хороший фрагмент кода Find Name, который я использую в решении WPF:
public static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i )
{
var child = VisualTreeHelper.GetChild(parent, i);
string controlName = child.GetValue(Control.NameProperty) as string;
if (controlName == name)
{
return child as T;
}
else
{
T result = FindVisualChildByName<T>(child, name);
if (result != null)
return resu<
}
}
return null;
}
Но это работает, только если я нахожусь в потоке пользовательского интерфейса.
У меня есть другой поток, который воспроизводит аудиофайл с конечной синхронизацией. Я хочу использовать приведенный выше код для установки свойства dep в потоке пользовательского интерфейса, но я продолжаю получать межпоточную ошибку.
Даже попытка простого:
SoundFXPad selectedSoundFXPad = (SoundFXPad)m_parent.FindName("panelC" numbervar);
Выдает мне ту же ошибку
Все другие потокобезопасные коды вызова диспетчера WPF, которые я видел, предполагают, что вы уже знаете имя элемента управления. Есть ли способ использовать приведенный выше код потокобезопасным способом, чтобы повлиять на элемент управления пользовательского интерфейса из другого потока, где имя должно быть «найдено»?
Спасибо!
Ответ №1:
Обычно для каждого приложения используется один поток пользовательского интерфейса (обычно; вы можете создать несколько, но это не часто). Итак, вам не нужно имя элемента управления, чтобы найти диспетчера — попробуйте это:
Application.Current.Dispatcher.Invoke(new Action(
delegate {
// Put code that needs to run on the UI thread here
}));
Комментарии:
1. Отлично! Это сделало свое дело! Нужно было только добавить дополнительную правую скобку в конце, и теперь у меня есть радость! Спасибо за быстрый ответ!