Tabcontrol TabItem中的WPF页面延迟加载

时间:2015-05-08 18:22:35

标签: c# wpf lazy-loading tabcontrol

我的Xaml WPF窗口里面有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>

问题是,当我打开此窗口时,帧内的所有页面同时加载,因此,例如,如果我在每个页面上加载MessageBox,我会得到很多。我希望只有在单击相应的选项卡标题时才能加载页面。 我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是继承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事件处理程序以调用特殊的init函数:

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()
        }
    }
}

如果您只是希望在第一次显示时发生这种情况,请在bool类中添加一个MyCustomTabItem变量,该变量会跟踪它是否已经发生过一次,如果是的话返回而不是再次运行它。