Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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
WPF,已加载事件,已加载属性_Wpf - Fatal编程技术网

WPF,已加载事件,已加载属性

WPF,已加载事件,已加载属性,wpf,Wpf,如果我将处理程序附加到元素的已加载事件(无论它是在VS设计器中还是在代码中),它会将IsLoaded属性设置为true 例如,我有一个带有两个TabItems的TabControl。每个选项卡项上都有一个按钮。第一个选项卡项是默认项(显示“我的窗口”时选择)。第二个选项卡Item上的按钮已附加加载的事件。在这种情况下,第一个TabItem上的按钮已加载并设置为true,第二个TabItem上的按钮应设置为false,但已设置为true 当我取消设置加载的事件时,它按预期工作-第一个按钮加载为tr

如果我将处理程序附加到元素的已加载事件(无论它是在VS设计器中还是在代码中),它会将IsLoaded属性设置为true

例如,我有一个带有两个TabItems的TabControl。每个选项卡项上都有一个按钮。第一个选项卡项是默认项(显示“我的窗口”时选择)。第二个选项卡Item上的按钮已附加加载的事件。在这种情况下,第一个TabItem上的按钮已加载并设置为true,第二个TabItem上的按钮应设置为false,但已设置为true

当我取消设置加载的事件时,它按预期工作-第一个按钮加载为true,第二个按钮加载为false

这是wpf错误还是我做错了什么

编辑:

请看一个例子

此代码导致btn2的IsLoaded属性设置为True(注意:btn2_Loaded方法为空)

XAML:

启动应用程序,只需单击btn1

现在删除加载的处理程序:

            <TabItem Header="Tab2">
                <Button x:Name="btn2" />
            </TabItem>

再次启动应用程序并单击btn1


现在IsLoaded是假的!为什么会这样?附加事件处理程序会导致加载特定元素?

这既不是WPF中的错误,也不是您做错了什么。上的MSDN页面显示

加载的事件在最终渲染之前引发,但在 布局系统已计算渲染所需的所有值


您无法对调用“精确加载”的时间做出更精确的假设。在您的例子中,我猜WPF延迟了不可见(即尚未呈现)元素的加载,除非附加了加载的处理程序。这样做是免费的。

所以您希望按钮2的已加载事件仅在选项卡更改时触发?这与触发事件无关。它与IsLoaded属性的值有关。将处理程序附加到button2的Loaded事件会导致将button2的IsLoaded属性设置为true。如果您没有附加处理程序,它将正确设置为false。我不确定是否不理解。我没有写关于调用已加载事件的内容,我对此不感兴趣。问题是,当我将任何处理程序附加到隐藏按钮2的已加载事件时(只需在VS designer'Loaded=“my_handler”中写入),IsLoaded属性会自动设置为true,即使它应该设置为false(因为按钮2位于非激活选项卡上)。
IsLoaded
在加载元素后为true,即,在引发
加载的
事件后。请参阅第一篇文章中的编辑。我仍然不明白为什么会发生这种情况。正如我所写的:WPF可以在元素初始化之后、渲染之前的任何时间自由加载(即设置
IsLoaded=true
并引发
Loaded
事件)。它可能会决定立即加载一个附加了事件处理程序的元素,并延迟加载一个没有事件处理程序的元素。我原以为加载的事件是在最终渲染之前引发的,但可能更早,我误解了这一部分。我用它来决定控件是渲染还是必须在内存中渲染。在本例中,IsLoaded为True,但尚未渲染。看来我得另找一条路了。谢谢
    private void btn1_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(this.btn2.IsLoaded.ToString());
    }
            <TabItem Header="Tab2">
                <Button x:Name="btn2" />
            </TabItem>