单击不同的选项卡时,Tabcontrol 中的框架总是刷新
Frames inside Tabcontrol always refreshes when clicking on Different Tabs
我使用 MVVM 模式在 WPF 中实现了动态选项卡创建。每个选项卡内都有一个框架,框架承载着一个页面。
<TabControl Name="mainTabControl" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding ObservableCollectionTabContent}" >
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Header}">
</TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<!--this is the body of the TabItem template-->
<DataTemplate>
<Frame NavigationUIVisibility="Hidden"
Source="{Binding FrameSource}" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
我的 ViewModel 看起来像这样。
public class MainWindowViewModel
{
private TabContent tabContent;
public ObservableCollection<TabContent> ObservableCollectionTabContent { get; set; }
public MainWindowViewModel()
{
ObservableCollectionTabContent = new ObservableCollection<TabContent>();
}
public void NewTab(String header, String navigatePageUri)
{
tabContent = new TabContent { Header = header, FrameSource = navigatePageUri };
this.ObservableCollectionTabContent.Add(tabContent);
// Set the new tab to be the current tab
ICollectionView collectionView = CollectionViewSource.GetDefaultView(this.ObservableCollectionTabContent);
if (collectionView != null)
{
collectionView.MoveCurrentToNext();
}
}
}
public sealed class TabContent
{
public String Header { get; set; }
public String FrameSource { get; set; }
}
现在我的问题是当打开了 1 个以上的选项卡并且想要在选项卡之间切换时,内部的框架会自动刷新,因此创建了托管在内部的页面的新实例,这是我不想要的。知道为什么我会发生这种情况吗?
TabControl 在 Tabs 出现时总是重新设置 Tabs 的内容。这是设计使然。
如果您希望每个选项卡在不再被选中时保持状态,那么您需要实现自己的自定义选项卡。
如果你google这个问题,你会看到很多人编写自己的有状态选项卡控件的例子
我使用 MVVM 模式在 WPF 中实现了动态选项卡创建。每个选项卡内都有一个框架,框架承载着一个页面。
<TabControl Name="mainTabControl" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding ObservableCollectionTabContent}" >
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Header}">
</TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<!--this is the body of the TabItem template-->
<DataTemplate>
<Frame NavigationUIVisibility="Hidden"
Source="{Binding FrameSource}" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
我的 ViewModel 看起来像这样。
public class MainWindowViewModel
{
private TabContent tabContent;
public ObservableCollection<TabContent> ObservableCollectionTabContent { get; set; }
public MainWindowViewModel()
{
ObservableCollectionTabContent = new ObservableCollection<TabContent>();
}
public void NewTab(String header, String navigatePageUri)
{
tabContent = new TabContent { Header = header, FrameSource = navigatePageUri };
this.ObservableCollectionTabContent.Add(tabContent);
// Set the new tab to be the current tab
ICollectionView collectionView = CollectionViewSource.GetDefaultView(this.ObservableCollectionTabContent);
if (collectionView != null)
{
collectionView.MoveCurrentToNext();
}
}
}
public sealed class TabContent
{
public String Header { get; set; }
public String FrameSource { get; set; }
}
现在我的问题是当打开了 1 个以上的选项卡并且想要在选项卡之间切换时,内部的框架会自动刷新,因此创建了托管在内部的页面的新实例,这是我不想要的。知道为什么我会发生这种情况吗?
TabControl 在 Tabs 出现时总是重新设置 Tabs 的内容。这是设计使然。 如果您希望每个选项卡在不再被选中时保持状态,那么您需要实现自己的自定义选项卡。
如果你google这个问题,你会看到很多人编写自己的有状态选项卡控件的例子