Визуальные элементы не отображаются при первой загрузке страницы
Я пытаюсь обновить все свои элементы текстового поля после загрузки моей страницы.
Вопрос
Почему текстовые поля не возвращаются при первой загрузке?
Explaination
У меня есть MainWindow с элементом Frame для навигации между страницами wpf.
Поэтому, когда пользователь нажимает на элемент меню, страница загружается во фрейм.
Вот код, когда пользователь щелкает элемент меню:
Код для загрузки новой страницы во фрейм (метод навигации)
public static void Navigate(Page page, double fadeTime = 0.6)
{
MainWindow MainWin = (MainWindow) Application.Current.MainWindow;
Frame NavFrame = MainWin.mainFrame;
if (NavFrame.Content != page)
{
NavFrame.NavigationService.Navigate(page);
//Gebruik Dispatcher om Fadein Effect te kunnen toepassen
Frame mainFrame = NavFrame;
NavFrame.Dispatcher.BeginInvoke(
new Action(() =>
{
//Voeg Animatie Toe
NavFrame.Opacity = 0;
DoubleAnimation fadeIn = new DoubleAnimation(0, 1, TimeSpan.FromSeconds(fadeTime), FillBehavior.HoldEnd);
mainFrame.BeginAnimation(UIElement.OpacityProperty, fadeIn, HandoffBehavior.Compose);
}));
//Bij navigeren naar andere pagina roep GC aan.
GC.Collect();
}
int amount = 0;
//Apply Color on CaretBrush
foreach (TextBox tb in Worker.FindVisualChildren<TextBox>(page))
{
amount++;
tb.CaretBrush = (Brush)new BrushConverter().ConvertFromString("#FF8E9CFF");
}
Worker.ShowModernBox(amount.ToString()); //Custom messagebox
page.UpdateDefaultStyle();
page.UpdateLayout();
}
Метод FindVisualChildren
//Haal alle elementen van huidige view op.
public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
//Indien het object gevuld is met componenten
if (depObj != null)
{
//Voor ieder Object in huidige view
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
//geef Child terug
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T) child;
}
//geef CHilds van CHild terug.
foreach (T childOfChild in FindVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}
Эта проблема
Когда пользователь загружает эту страницу в первый раз, он возвращает значение int как 0, при повторном нажатии я получаю все 19 возвращенных текстовых полей. это почему? Когда я отлаживаю его и расширяю свою страницу, я вижу там текстовые поля
1 ответ
Благодаря Прагматик.
Решение: привязка следующего кода к событию ContentRendered
foreach (TextBox tb in Worker.FindVisualChildren<TextBox>(page))
{
amount++;
tb.CaretBrush = (Brush)new BrushConverter().ConvertFromString("#FF8E9CFF");
}
Worker.ShowModernBox(amount.ToString()); //Custom messagebox
page.UpdateDefaultStyle();
page.UpdateLayout();
причина
Контент просто не отображался, когда visualTree находило элементы. Поэтому подождите, пока страница отобразит все содержимое, привязав ее к событию ContentRendered.
кредиты идут в Pragmateek