2016-12-07 61 views
0

我有一個簡單的C#WPF應用程序看起來像這樣:爲什麼一旦WPF添加到TabControl中,WPF就會爲一個視圖觸發Loaded事件?

enter image description here

我編程方式增加項目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事件。

回答

相關問題