Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义wpf选项卡控件,具有一个永久选项卡,所有其他选项卡均可滚动_C#_Wpf_Tabcontrol - Fatal编程技术网

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

C# 自定义wpf选项卡控件,具有一个永久选项卡,所有其他选项卡均可滚动,c#,wpf,tabcontrol,C#,Wpf,Tabcontrol,我需要创建一个控件,它有一个永久的主选项卡,所有其他选项卡都可以滚动 现在,我正试图通过子类化TabControl来实现这个结果,在覆盖的模板中添加一个看起来像选项卡的额外按钮,并在每次单击按钮时将SelectedIndex设置为-1。当SelectedIndex为-1时,一个触发器会导致TabControl的ContentControl绑定到一个特殊的主选项卡的内容。基本上,我是在假装真实选项卡的行为,并在这样做时覆盖取消选择所有选项卡的功能 这似乎是可行的,除了两个问题: 选择示例选项卡3,

我需要创建一个控件,它有一个永久的主选项卡,所有其他选项卡都可以滚动

现在,我正试图通过子类化TabControl来实现这个结果,在覆盖的模板中添加一个看起来像选项卡的额外按钮,并在每次单击按钮时将SelectedIndex设置为-1。当SelectedIndex为-1时,一个触发器会导致TabControl的ContentControl绑定到一个特殊的主选项卡的内容。基本上,我是在假装真实选项卡的行为,并在这样做时覆盖取消选择所有选项卡的功能

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

选择示例选项卡3,然后选择主页。然后,再次尝试选择选项卡3。表3没有响应。 选择选项卡3,然后选择主页。然后,尝试使用同一窗口中的菜单。当我使用菜单时,3会再次弹出作为所选选项卡。 在这一点上,我试着倾听与TabControl相关的各种事件,但它们似乎都没有给我提供一些我可以用来绕过这些行为的东西


是否存在允许我覆盖默认SelectedIndex行为的内容?我应该换一种方式吗?理想情况下,我希望有一种方法可以接收选项卡集合,这样可以在不丢失选项卡控件基本功能的情况下直观地拆分选项卡。

我能想到的实现这一点的唯一方法是为选项卡控件使用自定义控件模板。您可以使用获取当前模板。该模板的一部分需要替换为您编写的自定义面板。你们把它放在面板上。您只需覆盖ArrangeOverride,以便它将主页选项卡安排在其位置,其他选项卡则取决于滚动位置。

我可以通过编写自己的自定义选项卡面板来实现这一点,正如AresAvatar所建议的那样。但是,该面板需要从ConceptualPanel实现扩展。问题是面板需要在TabControl模板中设置IsItemsHost=true,以保留选项卡的选择行为。不幸的是,一旦一个普通面板是一个项目主机,它的子项就不能从它自己的类代码中更改。因此,我无法添加所需的滚动按钮。我可以通过AddVisualChild添加所有选项卡+滚动按钮来解决ConceptualPanel的问题


也许有更好的方法可以做到这一点,但这对我来说很有效。

我只是想澄清一下,你是否建议我编写自己的TabPanel?我已经在使用我自己的ControlTemplate作为选项卡控件。是的,这就是我的意思。如果我正确理解了您的问题,那么无论控件如何滚动,都会始终显示Home选项卡,这是您试图覆盖的TabPanel行为。听起来不错。我现在会研究它,如果我成功了,我会报告。有没有一种方法可以将自定义选项卡面板的InternalChildren放入ScrollViewer,然后在ScrollViewer上调用Measure/Arrange?我可以模仿现有选项卡面板的功能,但我不知道如何将另一个控件交给我的孩子。。。我甚至不确定这是不是一种方法。WPF对象不能有多个父对象。使用ArrangeOverride定义自定义面板非常简单。这里有一个例子:另外,我能够避免重写ScrollViewer的功能,只需编写一个扩展ConceptualPanel的额外面板,将相关选项卡传递给它,然后将整个内容放入ScrollViewer。