自定义wpf选项卡控件,带有一个永久选项卡,所有其他选项卡均可滚动

时间:2011-07-13 18:33:42

标签: c# wpf tabcontrol

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

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

除了两个问题外,这似乎有效:

  1. 选择示例选项卡#3,然后选择主页。然后,再次尝试选择标签#3。选项卡#3没有响应。
  2. 选择标签#3,然后选择主页。然后,尝试使用恰好位于同一窗口中的菜单。当我去使用菜单时,#3再次弹出选定的标签。
  3. 此时我曾试图听过与TabControl相关的各种事件,但是它们似乎都没有给我一些可以解决这些行为的东西。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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