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

例如,我有一个带有两个TabItem的TabControl。每个TabItem上都有一个按钮。第一个TabItem是默认项(在显示我的窗口时选择)。第二个TabItem上的Button附加了Loaded事件。在这种情况下,第一个TabItem上的按钮的IsLoaded设置为true,而第二个TabItem上的按钮应该设置为false,但将其设置为true。

当我取消设置Loaded事件时,它按预期方式工作-第一个按钮的IsLoaded为true,第二个按钮的值为false。

这是WPF错误还是我做错了什么?

编辑:

看一个例子。

此代码将btn2的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());
    }


启动应用程序,然后单击btn1。

现在删除Loaded处理程序:

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


再次启动应用程序,然后单击btn1。

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

最佳答案

这既不是WPF中的错误,也不是您做错了什么。 Object Lifetime Events上的MSDN页面说


在最终渲染之前,但在
布局系统已计算了所有必要的渲染值。


您不能对何时确切调用Load做出更精确的假设。在您的情况下,除非附加了Loaded处理程序,否则我认为WPF会延迟不可见(即尚未渲染)元素的加载。这样做是免费的。

关于wpf - WPF,Loaded事件,IsLoaded属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10709170/

10-09 17:38