簡體   English   中英

為什么WPF將視圖添加到TabControl后立即為該視圖觸發Loaded事件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM