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.

Если это может быть достигнуто путем точной настройки одной из указанных выше попыток или каким-либо совершенно новым способом, пожалуйста, пришлите идеи / код.

0 ответов

Другие вопросы по тегам