【问题标题】:Dynamically hide a WPF TabItem动态隐藏 WPF TabItem
【发布时间】:2016-02-20 04:29:37
【问题描述】:

假设我有一个非常简单的 XAML

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication2"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <TabControl>
            <TabItem Header="Tab 1" Visibility="Hidden">
                <TextBlock>shfsdjkfhksh jkfhd sfjdklh sfjdkh fjdkh fdjhf </TextBlock>
            </TabItem>
            <TabItem Header="Tab 2" Visibility="Hidden">
                <TextBlock>3807689vthvybhgthugbbjgkngoebt4uibn54</TextBlock>
            </TabItem>
        </TabControl>
    </StackPanel>
</Window>

如果我只是将TabItem 的可见性设置为隐藏,则该选项卡内的内容不会隐藏。

有没有办法将标签页头及其内容隐藏在一起?

【问题讨论】:

    标签: wpf tabcontrol tabitem


    【解决方案1】:

    您可以通过将 Visibility 绑定到父控件来做到这一点。如果您使用的是视图模型,则可以将可见性绑定到视图模型中的属性,并将该属性用于 TabItem 和 TextBlock。

    <StackPanel>
        <TabControl>
            <TabItem x:Name="tab1" Header="Tab 1" Visibility="Hidden">
                <TextBlock Visibility="{Binding Path=Visibility, ElementName=tab1}">shfsdjkfhksh jkfhd sfjdklh sfjdkh fjdkh fdjhf</TextBlock>
            </TabItem>
        </TabControl>
    </StackPanel>
    

    【讨论】:

    • 知道&lt;TextBlock Visibility="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TabItem}}, Path=Visibility}"&gt;shfsdjkfhksh jkfhd sfjdklh sfjdkh fjdkh fdjhf &lt;/TextBlock&gt; 有什么问题吗?它不适合我。
    • 通过实现视图模型并绑定到视图模型中的属性,您将为自己省去很多麻烦。 WPF 中的很多问题都可以通过视图模型得到简化。
    • 我知道,我需要快速交付一些 POC。在实际工作中,我将使用 PRISM。
    • 相对源没有找到祖先类型,因为它正在查看祖先级别 1 并且没有找到 TabItem。您可以使用像 Snoop 这样的实用程序来检查绑定的状态。我真的不认为在这里使用 FindAncestor 真的很合适,因为这是您在使用模板时通常会使用的东西。此外,如果您的 UI 发生任何变化,您几乎可以肯定会破坏绑定。
    【解决方案2】:

    如果您将选定/活动选项卡的 Visibility 设置为 Hidden,则需要选择其他选项卡,例如

    <StackPanel>
        <TabControl>
            <TabItem x:Name="T1" Header="Tab 1" Visibility="Hidden" >
                <TextBlock>1111111111111111111</TextBlock>
            </TabItem>
            <TabItem x:Name="T2" Header="Tab 2" IsSelected="True">
                <TextBlock>22222222222222222222222</TextBlock>
            </TabItem>
        </TabControl>
    </StackPanel>
    

    如果TabItem 已隐藏且未选中,则无需隐藏TabItem 的内容。

    【讨论】:

    • 我想同时隐藏这两个怎么办?那我没有什么可以选择的了。
    • @hardywang 然后在TabControl 上设置Visibility。没有任何标签的TabControl 是一个非常奇怪的设计。
    • 我想通过 c# 代码隐藏但不隐藏。 tab2.isselected=真; tab1.visibility=visibility.hidden;
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2016-07-18
    • 2013-03-16
    • 1970-01-01
    • 2011-04-25
    • 2012-05-30
    • 2011-09-19
    相关资源
    最近更新 更多