Визуальные элементы не отображаются при первой загрузке страницы



Я пытаюсь обновить все свои элементы текстового поля после загрузки моей страницы.

Вопрос

Почему текстовые поля не возвращаются при первой загрузке?

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

Другие вопросы по тегам