3

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

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

当我取消设置 Loaded 事件时,它按预期工作 - 第一个按钮 IsLoaded 为真,第二个按钮为假。

这是一个 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 是假的!为什么会这样?附加事件处理程序会导致加载特定元素?

4

1 回答 1

3

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

Loaded 事件在最终渲染之前引发,但在布局系统计算出所有必要的渲染值之后。

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

于 2012-05-23T06:02:26.150 回答