Я пытаюсь обновить все элементы своего текстового поля после загрузки моей страницы.
VisualElements не показан при первой загрузке страницы
Вопрос
Почему же TextBoxes не возвращается при первой загрузке?
Explaination
У меня есть MainWindow с элементом рамы в нем перемещаться между МОФ страниц.
Итак, когда пользователь нажимает на элемент меню, страница загружается в рамку.
Вот код, когда пользователь Нажмите на MenuItem:
Код для загрузки новой страницы в рамке (метод Navigate)
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 текстовых полей. почему это? Когда я отлаживаю его и я расширяю свою страницу, я могу видеть текстовые поля там
Визуальное дерево просто не была создана, когда страница будет перемещаться в первый раз. Однако почему такой сложный подход? Вместо этого вы можете просто привязать все свойства TextBoxes «CaretBrush» к одному свойству модели представления, или к статическому ресурсу или чему-либо еще, что вы измените при навигации по странице. – Clemens
'Navigate()' является асинхронным, поэтому вы должны зарегистрироваться в 'LoadCompleted'. – Pragmateek
Pragmateek, Спасибо! не работает для LoadCompleted, но это было сделано для ContentRendered на фрейме. –