具有单行 TabPanel 和溢出面板的 TabControl

2023-12-29

我想将 WPF TabControl 的功能更改为仅生成一行,并为每个其他项目(如 ToolBar / ToolBarOverflowPanel)创建一个溢出弹出窗口。目前 VisualStudio 中选项卡的显示方式相同。

这就是我得到的:

<Style TargetType="TabControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TabControl">
                <Grid KeyboardNavigation.TabNavigation="Local">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
                    <controls:OneLineTabPanel x:Name="HeaderPanel"
                                              Grid.Row="0"
                                              Panel.ZIndex="1"
                                              Margin="0"
                                              KeyboardNavigation.TabIndex="1"
                                              Background="Transparent">
                    </controls:OneLineTabPanel>
                 ......

我现在尝试更改 TabPanel(用于显示标题),但我无法更改其模板(因为它源自 TabPanel)。因此,我尝试从其他控件中派生,但后来我根本看不到任何项目。

我怎样才能让我自己的 ItemsControl 与 TabControl 一起使用?


您需要覆盖 TabControl 的整个模板。
幸运的是,使用 Visual Studio 可以轻松提取模板副本(在“文档大纲”窗口中的 TabControl 元素上右键单击 -> 编辑模板 -> 编辑副本)。

在默认 TabControl 模板 HeaderPanel 中定义如下:

<TabPanel x:Name="HeaderPanel" Grid.Column="0" IsItemsHost="true" Margin="2,2,2,0" Grid.Row="0" KeyboardNavigation.TabIndex="1" Panel.ZIndex="1"/>

主要思想是通过设置 IsItemsHost="true" 将 TabControl.Items 绑定到完全另一种控件类型,而不是绑定到 Panel 控件。 例如,要绑定到具有开箱即用的溢出按钮功能的工具栏:

<ToolBar x:Name="HeaderPanel" ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Items}"/>

以下是 TabControl 模板的完整示例,其中 ToolBar 作为标题面板:

<TabControl>
    <TabControl.Template>
        <ControlTemplate TargetType="{x:Type TabControl}">
            <Grid ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition x:Name="ColumnDefinition0"/>
                    <ColumnDefinition x:Name="ColumnDefinition1" Width="0"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition x:Name="RowDefinition0" Height="Auto"/>
                    <RowDefinition x:Name="RowDefinition1" Height="*"/>
                </Grid.RowDefinitions>

                <!--this will do the trick!!!-->
                <ToolBar x:Name="HeaderPanel" ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Items}"/>

                <Border x:Name="ContentPanel" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="0" KeyboardNavigation.DirectionalNavigation="Contained" Grid.Row="1" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local">
                    <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                </Border>
            </Grid>
            <ControlTemplate.Triggers>
                <Trigger Property="TabStripPlacement" Value="Bottom">
                    <Setter Property="Grid.Row" TargetName="HeaderPanel" Value="1"/>
                    <Setter Property="Grid.Row" TargetName="ContentPanel" Value="0"/>
                    <Setter Property="Height" TargetName="RowDefinition0" Value="*"/>
                    <Setter Property="Height" TargetName="RowDefinition1" Value="Auto"/>
                    <Setter Property="Margin" TargetName="HeaderPanel" Value="2,0,2,2"/>
                </Trigger>
                <Trigger Property="TabStripPlacement" Value="Left">
                    <Setter Property="Grid.Row" TargetName="HeaderPanel" Value="0"/>
                    <Setter Property="Grid.Row" TargetName="ContentPanel" Value="0"/>
                    <Setter Property="Grid.Column" TargetName="HeaderPanel" Value="0"/>
                    <Setter Property="Grid.Column" TargetName="ContentPanel" Value="1"/>
                    <Setter Property="Width" TargetName="ColumnDefinition0" Value="Auto"/>
                    <Setter Property="Width" TargetName="ColumnDefinition1" Value="*"/>
                    <Setter Property="Height" TargetName="RowDefinition0" Value="*"/>
                    <Setter Property="Height" TargetName="RowDefinition1" Value="0"/>
                    <Setter Property="Margin" TargetName="HeaderPanel" Value="2,2,0,2"/>
                </Trigger>
                <Trigger Property="TabStripPlacement" Value="Right">
                    <Setter Property="Grid.Row" TargetName="HeaderPanel" Value="0"/>
                    <Setter Property="Grid.Row" TargetName="ContentPanel" Value="0"/>
                    <Setter Property="Grid.Column" TargetName="HeaderPanel" Value="1"/>
                    <Setter Property="Grid.Column" TargetName="ContentPanel" Value="0"/>
                    <Setter Property="Width" TargetName="ColumnDefinition0" Value="*"/>
                    <Setter Property="Width" TargetName="ColumnDefinition1" Value="Auto"/>
                    <Setter Property="Height" TargetName="RowDefinition0" Value="*"/>
                    <Setter Property="Height" TargetName="RowDefinition1" Value="0"/>
                    <Setter Property="Margin" TargetName="HeaderPanel" Value="0,2,2,2"/>
                </Trigger>
                <Trigger Property="IsEnabled" Value="false">
                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </TabControl.Template>
</TabControl>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有单行 TabPanel 和溢出面板的 TabControl 的相关文章

  • MouseDoubleClick 事件不会冒泡

    我的场景经过简化 我有一个包含员工行的 ListView 在每个员工行中 都有 增加 和 减少 按钮来调整他的工资 假设在我的程序中 双击 员工 行意味着 解雇此人 The problem是当我快速单击 增加 时 这会触发 ListView
  • WPF:BinaryFormatter 可以序列化 FlowDocument 实例吗?

    我喜欢使用binaryformatter来序列化流文档 但这是例外 Serializable public class BinFlow public FlowDocument my get set BinFlow myBF new BinF
  • 当 DataTable 为空时,DataGrid 显示空行

    我有一个DataGrid dg1 绑定到DataTable 数据集 表 代码运行良好并且DataGrid正在显示数据DataTable正确 但是 如果我Clear the DataTable the DataGrid也很清楚 但留下一个空行
  • 在 WPF 媒体元素中连续重播视频

    我有一个在媒体元素中播放的视频文件 我需要继续播放 因此我尝试了 me play me MediaEnded new RoutedEventHandler me MediaEnded 使用此事件方法 loop to keep video p
  • 如何绑定到 DynamicResource 以便可以使用 Converter 或 StringFormat 等? (修订版4)

    注意 这是对早期设计的修订 该设计具有无法在某种样式中使用的限制 从而大大削弱了其有效性 然而 这个新版本现在可以使用样式 本质上是让您可以在任何可以使用绑定或动态资源的地方使用它并获得预期的结果 从而使其更加有用 从技术上讲 这不是一个问
  • 如何在 WPF 中设置窗口边框和标题栏的样式? [复制]

    这个问题在这里已经有答案了 我们正在开发一个 WPF 应用程序 它使用 Telerik 的控件套件 一切正常且看起来很好 不幸的是 我们最近需要替换所有对话框的基类 将 RadWindow 更改为标准 WPF 窗口 原因与本讨论无关 通过这
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • 如何将 WPF 3.0 下构建的应用程序转换为 4.5 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在 WPF 3 0 中构建了一个应
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • WPF Treeview,如何更改缩进

    我的树视图基本上有 文件夹 节点 以及不包含其他项目的项目下面的一层 因此 不需要用于展开 折叠图标的空间 在第 2 层 我可以放弃这个图标空间从而减少缩进吗 项目 在示例 机场 中 应向左移动一些像素 重要提示 基本上是寻找代码解决方案
  • 使用隧道而不是冒泡的路由命令

    我有一个自定义控件 MyControl 公开自定义命令 我想要家长Window能够调用此命令 以及所有MyControls应该对此做出反应 我已将命令添加到MyControl s CommandBindings集合 它还提供了CanExec
  • 如何在 WPF 中设置覆盖全局样式的特定控制元素设置?

    我通过应用程序范围的资源字典为应用程序中的按钮定义了全局样式 样式如下所示 来自另一个 SO 示例
  • 使用 XAML 地图控件在基于 C# VS2013 WPF 的 OpenStreetMap 的地图上添加热图图层

    我正在尝试使用 XAML MAP 控件 https xamlmapcontrol codeplex com https xamlmapcontrol codeplex com 在基于 C VS2013 WPF 的 OpenStreetMap
  • WPF 日历控件按住鼠标

    所以我放弃了标准的 WPFCalendarVS2010 中全新 WPF 应用程序中的 MainWindow xaml 控件 如果我单击日历中的某一天 然后尝试单击应用程序的 关闭 按钮 则我必须在关闭按钮上单击两次才能接受单击 它的表现就好
  • 密码盒和 MVVM

    我们有以下场景 MVVM 用户界面 用户可以在其中输入密码 实际上是一个PasswordBox 应该做一些工作的服务器 服务器连接到一些需要身份验证的数据库 我已经读过这个关于MVVM中PasswordBox的问题 https stacko
  • 在 XAML 中设置依赖项属性时,为什么会在运行时绕过 .NET 属性包装器?

    我正在阅读 Adam Nathan 的书 WPF 4 Unleashed 第 82 页有以下警告 在 XAML 中设置依赖属性时 NET 属性包装器会在运行时被绕过 虽然 XAML 编译器依赖于 编译时的属性包装器 WPF 调用底层 直接在
  • 何时为 WPF/MVVM 使用事件和命令?

    我正在练习如何使用 MVVM 模式编写 WPF 应用程序 到目前为止 我还没有在我的代码中使用命令 在我的视图模型中我实现INotifyPropertyChanged并使用 事件PropertyChangedEventHandler Pro
  • 如何使用 WPF 用户控件关闭父窗口

    假设我有两个 WPF 窗口 window One 和 window Two window One 有一个按钮 单击此按钮将打开 window Two window Two contains a User Control 该用户控件有一个用于
  • WPF PRISM 事件订阅不会消亡

    我有一个 PRISM RegionManager 其中有几个区域 顶部的功能区区域和其下方用于我的视图的主要内容区域 相当基本 该应用程序以主要内容区域中的 主页 视图开始 当我单击功能区上的按钮时 我将第二个视图注入内容区域并在区域管理器

随机推荐