Как использовать событие MouseWheel для прокрутки TabItems вложенных TabControls? - PullRequest
1 голос
/ 30 августа 2011

У меня есть TabControl, который может содержать TabControl в каждом TabItem. Есть xaml-код:

<TabControl  Height="300" Width="500" MouseWheel="TabControl_MouseWheel">
       <TabItem Header="1" Width="50">
            <TabControl MouseWheel="TabControl_MouseWheel">
                <TabItem Header="1" Width="50"></TabItem>
                <TabItem Header="2" Width="50"></TabItem>
                <TabItem Header="3" Width="50"></TabItem>
                <TabItem Header="4" Width="50"></TabItem>
                <TabItem Header="5" Width="50"></TabItem>
                <TabItem Header="6" Width="50"></TabItem>
                <TabItem Header="7" Width="50"></TabItem>
                <TabItem Header="8" Width="50"></TabItem>
                <TabItem Header="9" Width="50"></TabItem>
            </TabControl>
        </TabItem>
        <TabItem Header="2" Width="50">
            <TabControl MouseWheel="TabControl_MouseWheel">
                <TabItem Header="1" Width="50"></TabItem>
                <TabItem Header="2" Width="50"></TabItem>
                <TabItem Header="3" Width="50"></TabItem>
                <TabItem Header="4" Width="50"></TabItem>
                <TabItem Header="5" Width="50"></TabItem>
                <TabItem Header="6" Width="50"></TabItem>
                <TabItem Header="7" Width="50"></TabItem>
                <TabItem Header="8" Width="50"></TabItem>
                <TabItem Header="9" Width="50"></TabItem>
            </TabControl>
        </TabItem>
        <TabItem Header="3" Width="50"></TabItem>
        <TabItem Header="4" Width="50"></TabItem>
        <TabItem Header="5" Width="50"></TabItem>
        <TabItem Header="6" Width="50"></TabItem>
        <TabItem Header="7" Width="50"></TabItem>
        <TabItem Header="8" Width="50"></TabItem>
        <TabItem Header="9" Width="50"></TabItem>
    </TabControl>

Я хочу изменить выбранный элемент управления вкладками с помощью мыши. Есть обработчик события MouseWheel:

private void TabControl_MouseWheel(object sender, MouseWheelEventArgs e)
    {
        TabControl tabControl = sender as TabControl;
        if (tabControl != null)
        {
            if (e.Delta < 0)
            {
                if (tabControl.SelectedIndex + 1 < tabControl.Items.Count)
                    tabControl.SelectedItem = tabControl.Items[tabControl.SelectedIndex + 1];
            }
            else
            {
                if (tabControl.SelectedIndex - 1 > -1)
                    tabControl.SelectedItem = tabControl.Items[tabControl.SelectedIndex - 1];
            }
        }
    }

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

Например: если курсор находится в одном из верхних элементов TabControl, я хочу, чтобы они реагировали на прокрутку колесика мыши, в противном случае я хочу, чтобы нижние элементы TabControls реагировали на прокрутку.

1 Ответ

1 голос
/ 30 августа 2011

Внутренняя TabControls реагирует, но вы едва замечаете, как переключается и внешняя вкладка, просто добавьте строку e.Handled = true в самом конце обработчика, и она должна работать как положено, поскольку событие больше не будет пузырь до внешнего обработчика.

(Кстати, поскольку событие всплывает, вы можете сделать эту работу, только добавив обработчик к событию во внешнем TabControl, вам нужно немного изменить логику в обработчике, чтобы получить «ближайший») Хотя TabControl)

...