WPF 保留 Tab 控件状态
我已阅读帖子@ 如何停止 Wpf Tabcontrol 以在选项卡更改时卸载可视化树,但我无法让它工作,我一定是错过了一些东西。请帮忙。谢谢,
我正在使用示例项目中的 TabControlEx 类 @ http://www.pluralsight-training.net/community/blogs/eburke/archive/2009/04/30/keeping-the-wpf-tab-control-from-destroying-its-children.aspx
<Window x:Class="MyMainwindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sharedC="clr-namespace:myShared.Converter;assembly=myShared"
xmlns:mainTab="clr-namespace:MyWPFLib.View" Title="{Binding Title}"
Height="600" Width="850" Top="223" Left="164" ResizeMode="CanResize" Closing="WindowClosing"
WindowStyle="ToolWindow">
<Grid>
<mainTab:TabControlEx IsSynchronizedWithCurrentItem="True"
Grid.Row="0"
Margin="10 0 5 5"
x:Name="MainTabRegion"
TabStripPlacement="Top"
SelectedIndex="{Binding Tabs.SelectedIndex}"
ItemsSource="{Binding Tabs.TabItems}"
>
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Header">
<Setter.Value>
<Binding Path="Header"/>
</Setter.Value>
</Setter>
<Setter Property="Visibility"
Value="{Binding IsVisible, Mode=OneWay, Converter={StaticResource boolToVis}}"/>
</Style>
</TabControl.ItemContainerStyle>
</mainTab:TabControlEx>
</Grid>
</Window>
Datasource for the maintab is Tabs.TabItems
public ObservableCollection<ITabControl> TabItems
{
get
{
return _items;
}
}
每个 TabItem 都是用
<DataTemplate DataType="{x:Type vm:Item1ViewModel}">
<vw:View1 />
</DataTemplate>
I have read the posts @ How to stop Wpf Tabcontrol to unload Visual tree on Tab change, but I could not get it work, I must have missed something. Pls help. thanks
I am using class TabControlEx from sample project @ http://www.pluralsight-training.net/community/blogs/eburke/archive/2009/04/30/keeping-the-wpf-tab-control-from-destroying-its-children.aspx
<Window x:Class="MyMainwindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sharedC="clr-namespace:myShared.Converter;assembly=myShared"
xmlns:mainTab="clr-namespace:MyWPFLib.View" Title="{Binding Title}"
Height="600" Width="850" Top="223" Left="164" ResizeMode="CanResize" Closing="WindowClosing"
WindowStyle="ToolWindow">
<Grid>
<mainTab:TabControlEx IsSynchronizedWithCurrentItem="True"
Grid.Row="0"
Margin="10 0 5 5"
x:Name="MainTabRegion"
TabStripPlacement="Top"
SelectedIndex="{Binding Tabs.SelectedIndex}"
ItemsSource="{Binding Tabs.TabItems}"
>
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Header">
<Setter.Value>
<Binding Path="Header"/>
</Setter.Value>
</Setter>
<Setter Property="Visibility"
Value="{Binding IsVisible, Mode=OneWay, Converter={StaticResource boolToVis}}"/>
</Style>
</TabControl.ItemContainerStyle>
</mainTab:TabControlEx>
</Grid>
</Window>
Datasource for the maintab is Tabs.TabItems
public ObservableCollection<ITabControl> TabItems
{
get
{
return _items;
}
}
each TabItem is built with
<DataTemplate DataType="{x:Type vm:Item1ViewModel}">
<vw:View1 />
</DataTemplate>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我一直使用该链接中的代码,没有任何问题,尽管我注意到自从我第一次获得代码以来该网站已经发生了变化。您可能想检查我所拥有的代码与网站所拥有的代码之间是否存在任何差异。
这是我在他们更改站点之前获得的代码:
我确实对原始代码进行了一些更改,因为我拖放选项卡并且不想在删除项目并重新添加它时重新创建选项卡,但老实说时间太久了,我都忘了哪部分是我的,哪部分不是。
我做了一个快速测试来仔细检查,是的,它确实保留了您的非绑定值,例如选定的或扩展的值。
编辑
为了回应您下面的评论,请将 DataTemplates 放入您的
资源
中定义每个选项卡使用哪个 UserControl 的位置。当 TabControl 尝试绘制每个选项卡的内容时,它将使用您为该数据类型ViewModel 定义的任何 DataTemplate...
EDIT #2
Text XAML,根据您的要求
I use the code from that link all the time without a problem, although I notice that the website has changed since when I first got the code. You may want to check for any code differences between what I have and what the website has.
Here's the code I got before they changed the site:
I did make some changes to the original code because I was dragging/dropping tabs and didn't want to re-create the tabs when removing an item and re-adding it, but honestly it's been so long that I forget what part is mine and what isn't.
I did a quick test to double-check, and yes it does keep your non-bound values such as selected or expanded values.
EDIT
In response to your comments below, put DataTemplates in your
Resources
somewhere that define which UserControl to use for each Tab. When the TabControl tries to draw each Tab's Content, it will use whatever DataTemplate you defined for that data typeViewModel...
EDIT #2
Text XAML, as you requested
我放弃了解决方法,它对我来说不起作用。我购买了一个第三方 WPF 库 (DevExpress WPF) 来解决这个问题。谢谢
I gave up with the workaround, it just did not work in my case. I purchase a third party WPF library (DevExpress WPF) which solves the issue. thanks