【问题标题】:WPF Tabcontrol with expander functionality for tabitemsWPF Tabcontrol 具有用于 tabitems 的扩展器功能
【发布时间】:2019-06-17 09:04:26
【问题描述】:

我对 WPF 很陌生,但我正在尝试混合选项卡控件和扩展器的功能。

我希望能够按下标题中具有扩展器的每个选项卡项,这将扩展下面的内容。 几乎就像一个普通的选项卡,除了我现在应该能够按下该选项卡/展开器并且选项卡控件应该能够展开/折叠,只显示选项卡标题。

我无法让展开/折叠功能发挥作用,并且 Tab 控件将始终像没有展开器的普通控件一样保持打开状态。

目前我的 XAML 看起来像这样:

<TabControl>
        <TabItem >
            <TabItem.Header>
                <Expander Header="One" IsHitTestVisible="False"  
                  IsExpanded="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" />
            </TabItem.Header>
            <TextBlock Background="Red"/>
        </TabItem>
        <TabItem>
            <TabItem.Header>
                <Expander Header="Two" IsHitTestVisible="False" 
                  IsExpanded="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}" />
            </TabItem.Header>
            <TextBlock Background="Aqua" />
        </TabItem>
    </TabControl>

如果我应该完全以另一种方式获得整体功能,请务必指出那个方向。

【问题讨论】:

  • 您可能需要为您的 TabControl 和标题自定义模板。查看默认模板并进行相应修改通常是个好主意。
  • 所以如果你改变标签,你需要设置IsExpanded= false我对吗?
  • @Avinash Reddy - 是的。我应该能够展开/折叠整个选项卡控件并在展开时显示特定选项卡的内容。举个例子:选项卡控件一开始是折叠的,您只能看到 2 个选项卡项及其名称和扩展器按钮。我按下第一个选项卡项目(扩展器),整个选项卡控件展开,显示我在该选项卡内容区域中选择的任何内容。从这里我应该能够做两件事。再次按 Tab 1 可折叠整个 Tab Control,或按 Tab 2 并显示 Tab 2 中的内容。希望这是有道理的。

标签: c# wpf xaml


【解决方案1】:

这是我能想到的最简单的解决方案。我仍然有点困惑你想要什么

虚拟机

 private bool myVar;

    public bool ShowItem
    {
        get { return myVar; }
        set { myVar = value; OnPropertyChanged("ShowItem"); }
    }


    private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ShowItem = true;
    }

    private void Expander_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        ShowItem = !ShowItem;
    }


     <TabControl SelectionChanged="TabControl_SelectionChanged">
                <TabItem   PreviewMouseLeftButtonDown="Expander_PreviewMouseLeftButtonUp" >
                        <TabItem.Header>
                        <Expander Header="One" IsHitTestVisible="False" 
                      IsExpanded="{Binding ShowItem}" />
                        </TabItem.Header>
                    <TextBlock Background="Red" >
                        <TextBlock.Style>
                            <Style TargetType="TextBlock">
                                <Setter Property="Visibility" Value="Collapsed"></Setter>
                                <Style.Triggers>

                                    <DataTrigger Binding="{Binding ShowItem}" Value="True">
                                        <Setter Property="Visibility" Value="Visible"></Setter>
                                    </DataTrigger>

                                </Style.Triggers>
                            </Style >
                        </TextBlock.Style>

                    </TextBlock>
                </TabItem>
                <TabItem  PreviewMouseLeftButtonDown="Expander_PreviewMouseLeftButtonUp">
                        <TabItem.Header>
                            <Expander Header="Two" IsHitTestVisible="False" 
                      IsExpanded="{Binding ShowItem}" />
                        </TabItem.Header>
                    <TextBlock Background="Aqua" >
                        <TextBlock.Style>
                            <Style TargetType="TextBlock">
                                <Setter Property="Visibility" Value="Collapsed"></Setter>
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding ShowItem}" Value="True">
                                        <Setter Property="Visibility" Value="Visible"></Setter>
                                    </DataTrigger>

                                </Style.Triggers>
                            </Style >
                        </TextBlock.Style>
                    </TextBlock>
                </TabItem>
                </TabControl>

你可以使用转换器而不是样式,也可以尝试一次,如果我缺少任何东西,请告诉我

基于评论

 <TabItem>
                <TabItem.Header>
                    <StackPanel Background="Transparent" PreviewMouseLeftButtonDown="Expander_PreviewMouseLeftButtonUp">
                        <Expander Header="One" IsHitTestVisible="False" PreviewMouseLeftButtonDown="Expander_PreviewMouseLeftButtonUp" 
                  IsExpanded="{Binding ShowItem}" />
                    </StackPanel>
                </TabItem.Header>

【讨论】:

  • 我确实试过了,几乎就在那里,尽管它是折叠的内容并且主要的 tabcontrol 保持不变。为您提供我搜索的最佳实时示例,如果您以纯标准配置打开 Visual Studio。当您打开解决方案时,您通常会在左上角看到“服务器资源管理器”、“工具箱”、“数据源”等选项卡。这些标签充当标签控件和扩展器的混合。您可以单击每个选项卡,也可以单击同一选项卡将其再次折叠以仅显示选项卡名称。
  • 它的工作原理是一样的。正如我所看到的,在 Vs 中,Server Explorer 也会留在那里。如果你想要完全一样,你可以像他们一样使用按钮。和Handel点击事件@Gulerod
  • 如果可能的话,添加一个 ss 代码有什么问题。 @Gulerod
  • 我又试了一次,你是对的。它像我希望的那样工作。我的代码中出现了一些错误。现在唯一的问题是,如果我单击内容(即红色或蓝色文本块),它也会崩溃。这些文本块稍后将替换为用户控件,我想在不折叠标签的情况下单击它们。
  • 效果很好!感谢您的所有回答和支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
相关资源
最近更新 更多