Найти имя элемента управления из потока, не являющегося пользовательским интерфейсом - PullRequest
2 голосов
/ 18 апреля 2011

Я нашел хороший фрагмент кода 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 result;
            }
        }
        return null;
    }

Но это работает, только если я в потоке пользовательского интерфейса.

У меня естьдругой поток, который воспроизводит аудиофайл с синхронизацией конца.Я хочу использовать приведенный выше код для установки свойства dep в потоке пользовательского интерфейса, но постоянно получаю ошибку в нескольких потоках.

Даже попробуйте простое:

SoundFXPad selectedSoundFXPad = (SoundFXPad)m_parent.FindName("panelC" + numbervar);

Дает мнета же ошибка

Все остальные поточно-ориентированные коды диспетчера-вызовов WPF, которые я видел, предполагают, что вы уже знаете имя элемента управления.Есть ли способ использовать любой из приведенных выше кодов в поточно-ориентированном виде, чтобы повлиять на элемент управления пользовательского интерфейса из другого потока, в котором нужно «найти» имя?

Спасибо!

1 Ответ

1 голос
/ 18 апреля 2011

Обычно для каждого приложения существует один поток пользовательского интерфейса (обычно вы можете создать несколько, но это не распространено). Поэтому вам не нужно имя элемента управления для поиска диспетчера - попробуйте это:

Application.Current.Dispatcher.Invoke(new Action(
    delegate {
         // Put code that needs to run on the UI thread here
    }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...