Вам просто нужно выполнить действие с диспетчером с помощью BeginInvoke. Теперь у меня есть доступ к визуализированному визуальному дереву, и я смог получить искомые элементы управления.
Это мой код сейчас:
private void cbShows_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox cb = sender as ComboBox;
if (cb.SelectedItem != null)
{
Show selectedShow = (Show)cb.SelectedItem;
txtShowname.Text = selectedShow.ShowName;
icHalfHourBlocks.DataContext = selectedShow.HalfHourItems;
icHalfHourBlocks.ItemsSource = selectedShow.HalfHourItems;
gridShowGrid.Visibility = Visibility.Visible;
////////////////////////////////////////////////
Dispatcher.BeginInvoke(new Action(() =>
{
IEnumerable<Expander> elements = FindVisualChildren<Expander>(icHalfHourBlocks).Where(x => x.Tag != null && x.Tag.ToString() == "HalfHourBlock");
}), DispatcherPriority.Render);
////////////////////////////////////////////////
}
}
@ RaceRalph спасибо за ваш совет.
Обновление:
Я нашел лучшее решение в этом случае. Метод UpdateLayout () выполняет обновление дерева визуалов.
private void cbShows_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox cb = sender as ComboBox;
if (cb.SelectedItem != null)
{
Show selectedShow = (Show)cb.SelectedItem;
txtShowname.Text = selectedShow.ShowName;
icHalfHourBlocks.DataContext = selectedShow.HalfHourItems;
icHalfHourBlocks.ItemsSource = selectedShow.HalfHourItems;
IcHalfHourBlocks.UpdateLayout(); // <-- My new solution
IEnumerable<Expander> elements = FindVisualChildren<Expander>(icHalfHourBlocks)
.Where(x => x.Tag != null && x.Tag.ToString() == "HalfHourBlock");
gridShowGrid.Visibility = Visibility.Visible;
}
}