Tabcontrol 中的 WPF 页面 TabItem 延迟加载

WPF Page Within Tabcontrol TabItem Lazy loading

我有 Xaml WPF window,里面有 TabControl。它的每个 TabItem 都包含一个框架内的页面,如下所示:

 <TabItem >
            <TabItem.Header>
                Users
            </TabItem.Header>
            <Frame Source="/Views/UsersPage.xaml"  />
 </TabItem>
 <TabItem>
            <TabItem.Header>
                Stats
            </TabItem.Header>
            <Frame Source="/Views/OrdersPage.xaml"/>
</TabItem>

问题是当我打开这个 window 框架内的所有页面时同时加载,所以如果,例如,我在每个页面加载上放置 MessageBox 我会得到很多。我希望我的页面仅在我单击相应的选项卡 header 时加载。 我怎样才能做到这一点?

一个可能的解决方案是像这样从 TabItem 继承:

public class MyCustomTabItem : TabItem
{
    public void MyCustomInitFunction()
    {
        //Do all your stuff here
    }
}

在其中放置您点击控件时应该发生的所有内容。

使用这些新项目创建您的 TabControl

<TabControl SelectionChanged="myTabControl_SelectionChanged" Name="myTabControl">
    <MyCustomTabItem Name="myTab1">
        <MyCustomTabItem.Header>
            Users
        </MyCustomTabItem.Header>
        <Frame Source="/Views/UsersPage.xaml"  />
     </MyCustomTabItem>
     <MyCustomTabItem Name="myTab2">
        <MyCustomTabItem.Header>
            Stats
        </MyCustomTabItem.Header>
        <Frame Source="/Views/OrdersPage.xaml"/>
    </MyCustomTabItem>
</TabControl>

连接 SelectionChanged 事件处理程序以调用您的特殊初始化函数:

private void myTabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    TabControl tc = (TabControl)e.Source;
    if(tc != null)
    {
        MyCustomTabItem ti = (MyCustomTabItem)tc.Items[tc.SelectedIndex];
        if(ti != null)
        {
            ti.MyCustomInitFunction()
        }
    }
}

如果您只希望在第一次显示时发生这种情况,请在您的 MyCustomTabItem class 中放置一个 bool 变量来跟踪它是否已经发生过一次,如果所以只是 return 而不是 运行 再一次。