如果我将处理程序附加到元素的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是假的!为什么会这样?附加事件处理程序会导致加载特定元素吗?
答案 0 :(得分:1)
这既不是WPF中的错误,也不是你做错了什么。 Object Lifetime Events上的MSDN页面说明了
Loaded事件在最终渲染之前引发,但在之后 布局系统已计算出所有必要的渲染值。
对于何时调用Loaded,您无法做出更精确的假设。在你的情况下,我猜WPF延迟加载不可见(即尚未渲染)的元素,除非附加了一个Loaded处理程序。这是免费的。