WPF Как перехватить событие TabControl SelectionChanged до его возникновения?
Подход, который я выбрал, заключается в том, чтобы определить, был ли нажат TabItem HEADER (и игнорировать щелчки в других местах).
Попытка 1:
Если я подключу событие предварительного просмотра мыши в XAML в TabControl
<TabControl PreviewMouseLeftButtonDown = "TabControl_PreviewMouseLeftButtonDown">
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<Image />
<TextBlock />
<TextBlock />
</StackPanel>
</TabItem.Header>
</TabItem>
<TabItem Header="etc" />
<TabItem Header="blah" />
<TabItem Header="blah" />
</TabControl>
результирующий обработчик событий срабатывает каждый раз, когда происходит щелчок в любом элементе в TabControl. Этого следует ожидать из-за туннелирования / пузырей и т. Д.
Однако я хочу определить, произошел ли щелчок в области TabHeader, поэтому я могу предпринять специальные действия и игнорировать все остальные случаи.
Теперь в обработчике событий
private void TabControl_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
}
Ни один из параметров отправителя, e.Source, e.OriginalSource не поможет с уверенностью сказать, что я нажал на вкладку.
Попытка 2:
Перемещена привязка события к отдельным элементам TabItems вместо TabControl; То же самое, без радости, параметры отправителя, источника и т. Д. Также бесполезны.
Попытка 3:
Перенес проводку события в StackPanel внутри TabItem.
Это выглядело более многообещающе, так как событие Preview Down происходит только при щелчке по заголовку, а это как раз то, чего я хочу; НО иногда событие не срабатывает из-за проблем со стилем; StackPanel не обязательно покрывает всю область заголовка TabItem! (И в любом случае, я думаю, что любое решение, зависящее от стиля, будет уклоняться от максимума)
Чего я пытаюсь достичь?
Я хочу перехватить событие SelectionChanged TabControl, прежде чем оно произойдет. то есть в мире WinForms у нас, вероятно, будет какое-то событие с именем TabControl_SelectionChanging. Но поскольку в современном продвинутом мире WPF / сарказма такой роскоши нет, мне пришлось прибегнуть к PreviewMouseLeftButtonDown.
Если это может быть достигнуто путем точной настройки одной из указанных выше попыток или каким-либо совершенно новым способом, пожалуйста, пришлите идеи / код.