[英]Why does WPF fire a Loaded event for a view as soon as it is added to a TabControl?
我有一個簡單的C#WPF應用程序,如下所示:
我以編程方式添加了Item2,我不知道為什么在將Loaded
事件添加到TabControl
之后不久又又在打開它時又觸發了它。
我的MainWindow.xaml
的代碼如下所示:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TabControl Name="MyTabControl" >
<TabItem Name="Item1" Header="Item1">
<local:Control1 />
</TabItem>
</TabControl>
</Grid>
</Window>
其背后的代碼是:
using System.Windows;
using System.Windows.Controls;
namespace WpfApplication1
{
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
var item = new TabItem
{
Content = new Control2(),
Header = "Item2"
};
MyTabControl.Items.Add(item);
}
}
}
如您所見,我有一個控件稱為Control1
,另一個控件稱為Control2
。 它們是通過以下MyControl.xaml
文件定義的:
<UserControl x:Class="WpfApplication1.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
</Grid>
</UserControl>
以及以下代碼隱藏在MyControl.xaml.cs
:
using System.Diagnostics;
namespace WpfApplication1
{
public abstract partial class MyControl
{
protected abstract string MyName { get; }
protected MyControl()
{
InitializeComponent();
Loaded += (sender, args) => Debug.Print("Loaded {0}", MyName);
Unloaded += (sender, args) => Debug.Print("Unloaded {0}", MyName);
}
}
public class Control1 : MyControl
{
protected override string MyName => "Control1";
}
public class Control2 : MyControl
{
protected override string MyName => "Control2";
}
}
打開應用程序時,將獲得以下控制台輸出:
Loaded Control1
Loaded Control2
當我切換到Item2時:
Unloaded Control1
Loaded Control2
回到項目1:
Unloaded Control2
Loaded Control1
后兩者是有道理的; 當我從控件導航時,它將在新控件被加載時被卸載。
但是,我不明白為什么在顯示Control2之前先加載它。 這將導致Control2在獲得Unloaded
事件之前,連續接收兩個Loaded
事件。
當我們顯式添加選項卡項時,每個選項卡項都會被加載並立即初始化,其中包含所有內容。(請參閱本主題以了解更多詳細信息, 延遲加載WPF選項卡內容 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.