2014-01-16 2 views
4

У меня довольно странное поведение в TabControl, чьи TabItems все рухнули: содержимое первого TabItem все еще отображается (но заголовок не является) ,TabControl: все элементы TabItems рухнули, но содержимое 1-го TabItem все еще видно

TabControl и его TabItems настроены так:

<TabControl> 
    <TabItem Header="Data 1" 
      Visibility="{Binding Path=DataTable1.HasRows, 
            Converter={StaticResource BoolToVisibility}}"> 
     <UI:ShowData DataContext="{Binding Path=DataTable1}"/> 
    </TabItem> 
    <TabItem Header="Data 2" 
      Visibility="{Binding Path=DataTable2.HasRows, 
            Converter={StaticResource BoolToVisibility}}"> 
     <UI:ShowData DataContext="{Binding Path=DataTable2}"/> 
    </TabItem> 
</TabControl> 

Если ни одна из таблиц данных не содержит ни одной строки, ни один из TabItems не должно быть показано на рисунке. (Я знал, что я мог бы скрыть весь TabControl в этом случае, но это не главное).

Фактически содержимое элемента вкладки «Заголовок 1» будет отображаться, несмотря на смятие TabItem! Сам заголовок TabItem свернут, отображается граница TabItems, которая содержит его содержимое и сам контент.

Edit/Add: Это можно легко воспроизвести с помощью этого кода (примечание с использованием Свернутым или Hidden не имеет никакого значения:?!

<TabControl> 
    <TabItem Header="Test 1" Visibility="Hidden"> 
     <Label>Test1</Label> 
    </TabItem> 

    <TabItem Header="Test 2" Visibility="Hidden"> 
     <Label>Test2</Label> 
    </TabItem> 
</TabControl> 

Так что случился здесь Любая помощь/подсказки оценили

+0

+1 Для упрощения кода проблемы при редактировании. – Sheridan

ответ

9

Итак, вы нашли настоящую проблему здесь ... Я посмотрел в Интернете и нашел несколько сообщений, которые относятся к этому. Некоторые говорят, что это ошибка, в то время как другие говорят, что это спроектированное поведение. знаю, что, хотя, несомненно, это скорее ошибка, чем функция.

В любом случае, вы хотите знать, как справиться с проблемой. .. Есть несколько решений. Один из них заключается в том, чтобы установить TabItem.Content в null, когда вы хотите скрыть вкладку, а другой - добавить пустой TabItem и выбрать этот элемент перед тем, как скрыть (чтобы он показывал пустое содержимое).

Вы можете прикрепить обработчик к TabItem.IsVisibleChanged Event, чтобы получать уведомления, когда Visibility свойство было изменено:

public void TabItemIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    // Hide TabItem.Content here 
} 

Вот некоторые ссылки на соответствующие должности:

Bug in TabControl/TabItem`s content visibility?
WPF TabControl - Select different tab when TabItem Visibility changes
Is there a workaround for this tabcontrol/tabitem bug

+0

Упомяните, пожалуйста, проголосовав? Вниз голосование без комментариев настолько бессмысленно. Из [Справочного центра] (http: // stackoverflow.com/help/why-vote), * голосование по почте сигнализирует о том, что сообщение содержит неправильную информацию, плохо изучено или не сообщает информацию *. Мой ответ не страдает ни одной из этих проблем, поэтому без комментариев вы ничего не сказали. – Sheridan

+0

спасибо за подтверждение того, что я уже подозревал. Я думаю, что это ошибка, возможно, в ControlTemplate. Ваше решение с пустым TabItem звучит как хороший обходной путь. Спасибо – ThorstenHa

+1

@Sheridan +1. Благодарю. В итоге у меня была пустая вкладка, которую я выбрал. Ваш совет решил мою проблему. BTW - обожаю комментарий нисходящего избирателя. Я думаю, вы должны быть вынуждены ввести комментарий, если вы голосуете за сообщение. – nikotromus

0

Может быть ошибка WPF, anywa y путем привязки видимости содержимого к видимости элемента табуляции.

<TabControl> 
     <TabItem x:Name="_test1Tab" Header="Test 1" Visibility="Hidden"> 
      <Label Visibility="{Binding ElementName=_test1Tab, Path=Visibility}">Test1</Label> 
     </TabItem> 

     <TabItem x:Name="_test2Tab" Header="Test 2" Visibility="Hidden"> 
      <Label Visibility="{Binding ElementName=_test1Tab, Path=Visibility}">Test2</Label> 
     </TabItem> 
    </TabControl> 
0

Моим решением было поставить TabItem, который я хотел спрятать в другом положении. Проблема возникает, только если вы хотите свернуть только первый TabItem.

3

Другое решение, которое я предпочитаю по сравнению с предложенными: привяжите видимость TabItem и его содержимое к тому же свойству (используя BooleanToVisibilityConverter). Вот простой пример:

<UserControl.Resources > 
    <BooleanToVisibilityConverter x:Key="boolToVis"/> 
</UserControl.Resources> 
<Grid> 
    <TabControl> 
     <TabItem Header="TabItem 1" Visibility="{Binding Item1Visibility, Converter={StaticResource boolToVis}}"> 
      <Label Content="Content 1" Visibility="{Binding Item1Visibility, Converter={StaticResource boolToVis}}"/> 
     </TabItem> 
     <TabItem Header="TabItem 2" Visibility="{Binding Item1Visibility, Converter={StaticResource boolToVis}}"> 
      <Label Content="Content 2" Visibility="{Binding Item1Visibility, Converter={StaticResource boolToVis}}"/> 
     </TabItem> 
    </TabControl> 
</Grid> 
Смежные вопросы