如何使用MouseWheel事件滚动嵌套tabcontrol的tabitem

本文关键字:tabcontrol tabitem 嵌套 滚动 何使用 MouseWheel 事件 | 更新日期: 2023-09-27 18:06:55

我有一个TabControl,可以在每个TabItem中包含一个TabControl。这里有xml代码:

<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>

我想通过鼠标滚轮改变tab控件的选定项。有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上方的选中项。我希望其他TabControls也能对鼠标滚动做出反应。

例如:如果光标在上面的TabControl项之一,那么我希望它们响应鼠标滚轮滚动,否则我希望下面的TabControl项响应滚动

如何使用MouseWheel事件滚动嵌套tabcontrol的tabitem

内部的TabControls确实反应,但是你几乎没有注意到外部标签切换,只是在处理程序的最后添加行e.Handled = true,它应该像预期的那样工作,因为事件将不再冒泡到外部处理程序。

(顺便说一下,当事件冒泡时,您可以只向外部TabControl上的事件添加处理程序,然后您需要稍微更改处理程序上的逻辑以获得"最接近"的TabControl)