0
我有一個簡單的C#WPF應用程序看起來像這樣:爲什麼一旦WPF添加到TabControl中,WPF就會爲一個視圖觸發Loaded事件?
我編程方式增加項目2,我不知道爲什麼它被添加到TabControl
再經過兩不久Loaded
事件被觸發當我打開它時。
的代碼爲我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
。
<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
:它們具有以下MyControl.xaml
文件中定義
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
事件。