TabControl:所有TabItems都已折叠,但第一个TabItem的内容仍然可见

时间:2014-01-16 14:10:29

标签: wpf visibility tabcontrol tabitem

我在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>

那么这里有什么问题?任何帮助/提示都表示赞赏!

4 个答案:

答案 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时才会出现问题。