【问题标题】:Custom wpf tab control with one permanent tab, all other tabs scrollable带有一个永久选项卡的自定义 wpf 选项卡控件,所有其他选项卡均可滚动
【发布时间】:2011-07-13 18:33:42
【问题描述】:

我需要创建一个具有单个永久选项卡(“主页”)的控件,并且所有其他选项卡都是可滚动的。

现在我试图通过继承 TabControl 来实现这个结果,向覆盖的模板添加一个额外的按钮(看起来像一个选项卡),并在单击按钮时将 SelectedIndex 设置为 -1。当SelectedIndex-1 时,触发器会导致TabControl 的ContentControl 绑定到特殊的“主页”选项卡的内容。基本上,我在伪造真实选项卡的行为,并在此过程中覆盖取消选择所有选项卡的能力。

这似乎可行,除了两个问题:

  1. 选择示例选项卡#3,然后选择主页。然后,尝试再次选择选项卡#3。 Tab #3 没有响应。
  2. 选择标签 #3,然后选择主页。然后,尝试使用恰好在同一个窗口中的菜单。当我去使用菜单时,#3 再次作为选定选项卡弹出。

此时我已尝试侦听与 TabControl 相关的各种事件,但它们似乎都没有为我提供可以解决这些行为的东西。

有什么东西可以让我覆盖默认的SelectedIndex 行为吗?我应该以另一种方式这样做吗?理想情况下,我想要某种方式来接收一组选项卡,这样我就可以在视觉上拆分选项卡,而不会丢失 TabControl 的基本功能。

【问题讨论】:

    标签: c# wpf tabcontrol


    【解决方案1】:

    我能想到的唯一方法是为选项卡控件使用自定义 ControlTemplate。您可以使用StyleSnooper 获取当前模板。该模板的一部分需要替换为您编写的自定义面板。您基于面板。您只需要覆盖 ArrangeOverride 以便它将 Home 选项卡安排在其位置,而其他选项卡则取决于滚动位置。

    【讨论】:

    • 澄清一下,你是在暗示我自己写 TabPanel 吗?我已经将自己的 ControlTemplate 用于选项卡控件。
    • 是的,这就是我的意思。如果我正确理解了您的问题,那么无论控件如何滚动,您都试图通过始终显示“主页”选项卡来覆盖 TabPanel 行为。
    • 听起来不错。如果我成功了,我现在会调查并报告。
    • 有没有办法可以将自定义选项卡面板的 InternalChildren 放入 ScrollViewer,然后在 ScrollViewer 上调用 Measure/Arrange?我可以模仿现有 TabPanel 的功能,但我不知道如何将另一个控件交给我的孩子...(我什至不确定这是否是这样做的方法)。
    • 没有。 WPF 对象不能有超过 1 个父对象。使用 ArrangeOverride 定义自定义面板非常简单。这是一个例子:switchonthecode.com/tutorials/…
    【解决方案2】:

    正如 AresAvatar 建议的那样,我可以通过编写自己的自定义选项卡面板来实现这一点。但是,面板需要从 http://www.codeproject.com/KB/WPF/ConceptualChildren.aspx 的 ConceptualPanel 实现扩展。问题是面板需要在 TabControl 模板中包含 IsItemsHost="true" 以保留选项卡的选择行为。不幸的是,一旦普通面板成为项目宿主,就不能从它自己的类代码中更改它的子项。所以,我无法添加我需要的滚动按钮。我可以通过 AddVisualChild 添加所有内容(选项卡 + 滚动按钮)来解决 ConceptualPanel 的问题。

    可能有更好的方法来做到这一点,但这对我有用。

    【讨论】:

    • 另外,我可以避免重写 ScrollViewer 的功能,只需编写一个扩展 ConceptualPanel 的额外面板,将相关选项卡传递给它,然后将整个内容放入 ScrollViewer。
    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2011-01-18
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多