WPF,Loaded事件,IsLoaded属性

wqsoz72f  于 2023-06-07  发布在  其他
关注(0)|答案(2)|浏览(377)

如果我将一个处理程序附加到元素的Loaded事件(无论它是在VS设计器中还是在代码中),它都会将IsLoaded属性设置为true。
例如,我有一个带有两个TabItem的TabControl。每个TabItem上都有一个按钮。第一个TabItem是默认项(显示我的窗口时选中)。第二个TabItem上的Button已附加Loaded事件。在这种情况下,第一个TabItem上的按钮IsLoaded设置为true,第二个TabItem上的按钮应该设置为false,但它设置为true。
当我取消设置Loaded事件时,它按预期工作-第一个按钮的IsLoaded为true,第二个为false。
这是一个wpf错误还是我做错了什么?

编辑:

请参见示例。
此代码导致btn 2的IsLoaded属性设置为True(注意:btn2_Loaded方法为空)。
XAML:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TabControl>
            <TabItem Header="Tab1">
                <Button x:Name="btn1" Click="btn1_Click" />
            </TabItem>

            <TabItem Header="Tab2">
                <Button x:Name="btn2" Loaded="btn2_Loaded" />
            </TabItem>
        </TabControl>
    </Grid>
</Window>

C#:

private void btn1_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(this.btn2.IsLoaded.ToString());
    }

启动应用程序,然后单击btn 1。
现在删除Loaded处理程序:

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

再次启动应用程序并单击btn 1。
现在的IsLoaded是假的!为什么会这样?附加事件处理程序会导致加载特定元素吗?

vh0rcniy

vh0rcniy1#

这既不是WPF中的bug,也不是你做错了什么。Object Lifetime Events上的MSDN页面显示
Loaded事件在最终呈现之前引发,但在布局系统计算出呈现所需的所有值之后。
您无法对何时调用Loaded进行任何更精确的假设。在你的情况下,我猜WPF延迟加载的非可见(即。尚未呈现)元素,* 除非 * 附加Loaded处理程序。这样做是自由的。

dbf7pr2w

dbf7pr2w2#

不要使用默认的wpf逻辑;从你的处理程序开始,通过使用属性数组,你可以从处理程序中列出你的自定义事件设置;

相关问题