WPF:自定义TabControl - TabItem标头丢失

时间:2016-06-15 08:51:07

标签: c# wpf xaml custom-controls

我正在使用此示例来自定义TabControl:

  

TabControlStyle - 第三部分.zip:   https://web.archive.org/web/20160319001935/http://www.blogs.intuidev.com/file.axd?file=2010%2f2%2fTabControlStyle+-+Part+Three.zip

来自网址:

  

https://web.archive.org/web/20160319001935/http://www.blogs.intuidev.com/post/2010/02/10/TabControlStyling_PartThree.aspx

现在如果你运行并选择样本5(TabControl_5_ScrollableTabPanel),你会发现一切正常。打开弹出窗口也可以。

然而,当添加一个带有自定义标题的新tabitem并打开右侧的弹出窗口时,会使tabitem的标题重置为最小尺寸并且内容丢失。

在TabControl_5_ScrollableTabPanel.xaml的示例中,我刚刚在现有的Tab 2和Tab 3之间添加了一个额外的tabitem:

<TabItem>
    <TabItem.Header>
      <StackPanel Orientation="Horizontal">
        <Rectangle Width="16" Height="16" Fill="Red" />
        <TextBlock Text="Test" />
      </StackPanel>
    </TabItem.Header>
  </TabItem>

我在UIElement.Measure()之后看到,DesiredSize对于带有自定义标题的标签不正确。 在ScrollableTabPanel中,我尝试更改 MeasureOverride 方法,以便对标题进行额外检查:

      //Loop through all child controls ...
  foreach (UIElement uieChild in this.InternalChildren)
  {
    // test:
    TabItem uieChildTabItem = uieChild as TabItem;
    if (uieChildTabItem != null && uieChildTabItem.HasHeader && uieChildTabItem.Header != null)
    {
      UIElement uieChildHeader = uieChildTabItem.Header as UIElement;
      if (uieChildHeader != null)
      {
        uieChildHeader.Measure(availableSize);
        resultSize.Width += uieChildHeader.DesiredSize.Width;
      }
    }
  // ...

...但它仍然没有将标题恢复到原始大小,显示其内容。

有没有人知道哪里出错了,为什么我的解决方案似乎不起作用?

1 个答案:

答案 0 :(得分:0)

您可以尝试将TabItem声明如下:

<TabItem Header="TabTest">
            <TabItem.HeaderTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Rectangle Width="16" Height="16" Fill="Red" />
                        <TextBlock Text="Test" />
                    </StackPanel>
                </DataTemplate>
            </TabItem.HeaderTemplate>               
        </TabItem>

根据此Tab Panel实现,它直接将TabItem的标题绑定到弹出窗口中的上下文菜单项标题。如果您尝试将某个UI元素提供给选项卡项标题而不是字符串,则会产生问题,并且此选项卡面板尝试在可视树中两次承载相同的UI元素。由于不允许,因此它从TabItem的标题中删除了UI元素,并仅显示在菜单项的标题中。