Позволяет отделить проблемы немного.
Для обработки события щелчка мыши элемент управления должен быть подготовлен для получения этого события, ему необходимо реализовать обработчик, и обработчик должен фактически принять событие. В случае 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
стиль.
Как ярлык ищет вас, когда вы размещаете его где-то еще в приложении? Возможно, это просто стиль по умолчанию, определенный где-то в ресурсах приложения. – grek40
@ grek40 Они выглядят одинаково, поэтому это должен быть стиль по умолчанию. –
Еще одно примечание к нажатию на тему: просто прослушайте 'PreviewMouseLeftButtonDown' в' TabItem', потому что в отличие от события 'MouseLeftButtonDown' оно действительно будет запущено;) – grek40