VisualElements не отображаются при первой загрузке страницы



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

Вопрос

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

Пояснение

У меня есть MainWindow с элементом Frame для навигации между страницами wpf.
Поэтому, когда пользователь щелкает элемент меню, страница загружается во фрейм.
Вот код, когда пользователь щелкает элемент MenuItem :

Код для загрузки новой страницы во фрейм (метод навигации)

    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 текстовых полей. почему это? Когда я отлаживаю его и расширяю свою страницу, я вижу там текстовые поля.


person Nick Prozee    schedule 07.09.2014    source источник
comment
Визуальное дерево просто не было создано при первом переходе на страницу. Однако, почему такой сложный подход? Вместо этого вы можете просто привязать все свойства CaretBrush TextBox к одному свойству модели представления, статическому ресурсу или чему-то еще, что вы меняете при переходе на страницу.   -  person Clemens    schedule 07.09.2014
comment
Navigate() является асинхронным, поэтому вам следует зарегистрироваться на LoadCompleted.   -  person Pragmateek    schedule 07.09.2014
comment
Pragmateek, Спасибо! не работало для LoadCompleted, но работало для ContentRendered на фрейме.   -  person Nick Prozee    schedule 07.09.2014


Ответы (1)


Спасибо Pragmateek.
Решение. Привязка следующего кода к событию 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

person Nick Prozee    schedule 07.09.2014