我在TabControl上有一个相当奇怪的行为,其TabItems都已折叠:第一个TabItem的内容仍然可见(但标题不是)。
TabControl及其TabItems设置如下:
<TabControl>
<TabItem Header="Data 1"
Visibility="{Binding Path=DataTable1.HasRows,
Converter={StaticResource BoolToVisibility}}">
<UI:ShowData DataContext="{Binding Path=DataTable1}"/>
</TabItem>
<TabItem Header="Data 2"
Visibility="{Binding Path=DataTable2.HasRows,
Converter={StaticResource BoolToVisibility}}">
<UI:ShowData DataContext="{Binding Path=DataTable2}"/>
</TabItem>
</TabControl>
如果没有数据表包含任何行,则不应显示任何TabItem。 (我知道我可以隐藏整个TabControl,但这不是重点。)
实际上,尽管TabItem被折叠,但仍会显示标签项“Header 1”的内容! TabItem的标题本身已折叠,TabItems边框包含其内容和内容本身。
修改/添加: 这可以使用此代码轻松复制(注意使用折叠或隐藏没有任何区别:
<TabControl>
<TabItem Header="Test 1" Visibility="Hidden">
<Label>Test1</Label>
</TabItem>
<TabItem Header="Test 2" Visibility="Hidden">
<Label>Test2</Label>
</TabItem>
</TabControl>
那么这里有什么问题?任何帮助/提示都表示赞赏!
答案 0 :(得分:9)
好的,所以你在这里发现了一个真正的问题......我环顾四周,发现了几个与此相关的帖子。有人说这是一个错误,而另一些人则认为这是设计行为。不知道哪个,虽然它似乎更像是一个bug而不是一个功能。
无论哪种方式,您都想知道如何处理问题。 ..有几种解决方案。一种只是在您想要隐藏选项卡时将TabItem.Content
设置为null
而另一种是另一种设置是在隐藏之前添加空TabItem
并选择该项目(以便它是空的内容是示出)。
您可以将处理程序附加到TabItem.IsVisibleChanged
Event,以便在Visibility
属性发生更改时收到通知:
public void TabItemIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
// Hide TabItem.Content here
}
以下是相关帖子的一些链接:
Bug in TabControl/TabItem`s content visibility?
WPF TabControl - Select different tab when TabItem Visibility changes
Is there a workaround for this tabcontrol/tabitem bug
答案 1 :(得分:3)
我更喜欢的另一个解决方案是:将TabItem 及其内容的可见性绑定到同一属性(使用BooleanToVisibilityConverter)。 这是一个简单的例子:
<UserControl.Resources >
<BooleanToVisibilityConverter x:Key="boolToVis"/>
</UserControl.Resources>
<Grid>
<TabControl>
<TabItem Header="TabItem 1" Visibility="{Binding Item1Visibility, Converter={StaticResource boolToVis}}">
<Label Content="Content 1" Visibility="{Binding Item1Visibility, Converter={StaticResource boolToVis}}"/>
</TabItem>
<TabItem Header="TabItem 2" Visibility="{Binding Item1Visibility, Converter={StaticResource boolToVis}}">
<Label Content="Content 2" Visibility="{Binding Item1Visibility, Converter={StaticResource boolToVis}}"/>
</TabItem>
</TabControl>
</Grid>
答案 2 :(得分:0)
可能是WPF错误,无论如何通过将内容可见性绑定到标签项可见性来绕过。
<TabControl>
<TabItem x:Name="_test1Tab" Header="Test 1" Visibility="Hidden">
<Label Visibility="{Binding ElementName=_test1Tab, Path=Visibility}">Test1</Label>
</TabItem>
<TabItem x:Name="_test2Tab" Header="Test 2" Visibility="Hidden">
<Label Visibility="{Binding ElementName=_test1Tab, Path=Visibility}">Test2</Label>
</TabItem>
</TabControl>
答案 3 :(得分:0)
我对此的解决方案是将我想隐藏的TabItem放在另一个位置。只有当您只想折叠第一个TabItem时才会出现问题。