1



我正在尝试在加载我的页面后更新我的所有文本框元素。

问题

为什么第一次加载时没有返回文本框?

解释

我有一个带有 Frame 元素的 MainWindow,可以在 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 个文本框。这是为什么?当我调试它并展开我的页面时,我可以看到那里的文本框

4

1 回答 1

0

感谢 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

于 2014-09-07T15:54:53.927 回答