2016-11-28 9 views
0

У меня есть TabItem и ранее установки заголовка в объекте, как это так,TabItem Заголовок выглядит иначе, как ярлык

<TabItem x:Name="Checked_Out_Items" Header="Clients In Use" Height="40" LostFocus="Checked_Out_Items_LostFocus" GotFocus="Checked_Out_Items_GotFocus" BorderThickness="0" > 

Однако, я столкнулся с проблемой, где нет Нажмите событие для этой вкладке. Я нашел решение, в котором мы можем вставить метку в качестве заголовка, указанного здесь, how to handle TabItem single click event in WPF?

Но, ярлык не похож на то, что мне нужно. Вот заголовок заголовка, определенный внутри объекта. enter image description here

Вот как это выглядит с ярлыком

 <TabItem x:Name="Checked_Out_Items" Height="40" LostFocus="Checked_Out_Items_LostFocus" GotFocus="Checked_Out_Items_GotFocus" BorderThickness="0" > 
      <TabItem.Header> 
       <Label Content="Clients In Use" Height="40" MouseLeftButtonDown="Checked_Out_Items_Clicked" Width="171" /> 
      </TabItem.Header> 

enter image description here

+0

Как ярлык ищет вас, когда вы размещаете его где-то еще в приложении? Возможно, это просто стиль по умолчанию, определенный где-то в ресурсах приложения. – grek40

+0

@ grek40 Они выглядят одинаково, поэтому это должен быть стиль по умолчанию. –

+0

Еще одно примечание к нажатию на тему: просто прослушайте 'PreviewMouseLeftButtonDown' в' TabItem', потому что в отличие от события 'MouseLeftButtonDown' оно действительно будет запущено;) – grek40

ответ

2

Позволяет отделить проблемы немного.

Для обработки события щелчка мыши элемент управления должен быть подготовлен для получения этого события, ему необходимо реализовать обработчик, и обработчик должен фактически принять событие. В случае TabItem событие щелчка мыши используется элементом управления, не отпуская события определенным пользователям.

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

Таким образом, другой вариант заключается в обработке события MouseLeftButtonDown, прежде чем он достигнет TabItem, что означает его обращение в дочернем элементе элемента табуляции.

Как сказано, для получения события элемент управления должен быть готов для получения события. Это значит, что Background не null (может быть Transparent) и IsHitTestEnabled="True" (по умолчанию это в большинстве случаев по умолчанию), и он должен фактически обрабатывать событие.

Для витрины, я использую Red вместо Transparent цвет фона. Красная область - это место, где щелчки мыши захватываются и обрабатываются.

<TabItem Padding="0"> 
    <TabItem.Header> 
     <Border Height="30" Width="50" 
       Background="Red" MouseLeftButtonDown="Item_MouseLeftButtonDown"> 
      <ContentPresenter 
       VerticalAlignment="Center" HorizontalAlignment="Center" 
       Content="T2"/> 
     </Border> 
    </TabItem.Header> 
    Test Content 2 
</TabItem> 

Или для того, чтобы иметь лучшее разделение между содержимым заголовка и нажмите обработку, HeaderTemplate могут быть использованы:

<TabItem Header="T3" Padding="0"> 
    <TabItem.HeaderTemplate> 
     <DataTemplate> 
      <Border MinHeight="30" MinWidth="50" 
        Background="Red" MouseLeftButtonDown="Item_MouseLeftButtonDown"> 
       <ContentPresenter 
        VerticalAlignment="Center" HorizontalAlignment="Center" 
        Content="{Binding}"/> 
      </Border> 
     </DataTemplate> 
    </TabItem.HeaderTemplate> 
    Test Content 3 
</TabItem> 

Проблема с любым подходом, опирающимся на дочерних элементах управления в том, что там по-прежнему является границей TabItem, и если пользователь нажимает эту границу, клик будет находиться за пределами дочернего элемента управления, и вкладка будет выбрана без выполнения обработчика кликов.

Таким образом, другой способ обработки изменений вкладок (а не кликов!) Должен обрабатывать событие TabControl.SelectionChanged и фильтровать события, которые на самом деле происходят из TabControl, а не из некоторых внутренних элементов содержимого.

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (e.Source == sender) 
    { 
     // this selection change is actually issued because of a tab change 
    } 
} 

Другое дело, я просто понял: Это же условие может быть использовано в TabItem.PreviewMouseLeftButtonDown для того, чтобы отфильтровать щелчки к заголовку TabItem против событий щелчка, происходящих из области содержимого.

Edit:

Причина Label смотрит отличается, что стиль шрифта активен для TabItem и Label использует некоторые из своих внутренних стилей, не обращая внимания на TabItem стиль.