我的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
,我会得到很多。我希望只有在单击相应的选项卡标题时才能加载页面。
我怎样才能做到这一点?
答案 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
变量,该变量会跟踪它是否已经发生过一次,如果是的话返回而不是再次运行它。