Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 第一次加载页面时未显示可视化元素_C#_.net_Wpf_Visualtreehelper - Fatal编程技术网

C# 第一次加载页面时未显示可视化元素

C# 第一次加载页面时未显示可视化元素,c#,.net,wpf,visualtreehelper,C#,.net,Wpf,Visualtreehelper,加载页面后,我正在尝试更新所有文本框元素。 问题 为什么第一次加载时没有返回文本框 解释 我有一个带有框架元素的主窗口,可以在wpf页面之间导航。 因此,当用户单击菜单项时,页面将加载到框架中。 以下是用户单击菜单项时的代码: 将新页面加载到框架中的代码(方法导航) publicstaticvoidnavigate(第页,双fadeTime=0.6) { MainWindow MainWin=(MainWindow)Application.Current.MainWindow; Frame Na



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

问题

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

解释

我有一个带有框架元素的主窗口,可以在wpf页面之间导航。
因此,当用户单击菜单项时,页面将加载到框架中。
以下是用户单击菜单项时的代码:

将新页面加载到框架中的代码(方法导航)

publicstaticvoidnavigate(第页,双fadeTime=0.6)
{
MainWindow MainWin=(MainWindow)Application.Current.MainWindow;
Frame NavFrame=MainWin.mainFrame;
如果(NavFrame.Content!=页面)
{
NavFrame.NavigationService.Navigate(第页);
//格布吕克和法登效应
框架主机=导航框架;
NavFrame.Dispatcher.BeginInvoke(
新操作(()=>
{
//动画脚趾
NavFrame.Opacity=0;
DoubleAnimation fadeIn=新的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();
}
整数金额=0;
//在CaretBrush上应用颜色
foreach(Worker.FindVisualChildren中的文本框tb(第页))
{
金额++;
tb.CaretBrush=(画笔)新画笔转换器().ConvertFromString(“#FF8E9CFF”);
}
Worker.ShowModernBox(amount.ToString());//自定义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;
                }
            }
        }
    }
//Haal alle elementen van huidige视图作品。
公共静态IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject
{
//Indien het对象gevuld符合组件EN
if(depObj!=null)
{
//huidige视图中的Voor ieder对象
for(int i=0;i
问题

用户第一次加载此页面时,它将int值返回为0,第二次单击时,我将返回所有19个文本框。为什么呢?当我调试它并展开页面时,我可以看到其中的文本框

感谢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();
foreach(Worker.FindVisualChildren中的文本框tb(第页))
{
金额++;
tb.CaretBrush=(画笔)新画笔转换器().ConvertFromString(“#FF8E9CFF”);
}
Worker.ShowModernBox(amount.ToString())//自定义消息框
page.UpdateDefaultStyle();
page.UpdateLayout();
原因

当visualTree查找元素时,内容根本没有呈现。因此,通过将页面绑定到ContentRendered事件,等待页面首先呈现其所有内容


积分转到Pragmateek

当页面第一次导航到时,视觉树根本没有被创建。然而,为什么要采用如此复杂的方法?您可以只将所有文本框的
CaretBrush
属性绑定到一个视图模型属性或静态资源或任何在页面导航时更改的属性。
Navigate()
是异步的,因此您应该注册到
LoadCompleted
。Pragmateek,谢谢!不适用于LoadCompleted,但适用于框架上呈现的内容。
 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();