如果我将一个处理程序附加到元素的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是假的!为什么会这样?附加事件处理程序会导致加载特定元素吗?
2条答案
按热度按时间vh0rcniy1#
这既不是WPF中的bug,也不是你做错了什么。Object Lifetime Events上的MSDN页面显示
Loaded事件在最终呈现之前引发,但在布局系统计算出呈现所需的所有值之后。
您无法对何时调用Loaded进行任何更精确的假设。在你的情况下,我猜WPF延迟加载的非可见(即。尚未呈现)元素,* 除非 * 附加Loaded处理程序。这样做是自由的。
dbf7pr2w2#
不要使用默认的wpf逻辑;从你的处理程序开始,通过使用属性数组,你可以从处理程序中列出你的自定义事件设置;