ComboBoxItem选择会触发TabControl_SelectionChanged事件。

4

我在一个TabItem里放置了一个ComboBox。 问题在于,当我选择任何ComboBoxItem时,TabControl_SelectionChanged事件会被触发。而我在这个事件中有一些函数,不希望在我更改ComboBox选项时执行。

 <TabControl x:Name="tb" HorizontalAlignment="Left" Height="299" Margin="10,10,0,0" VerticalAlignment="Top" Width="497" SelectionChanged="TabControl_SelectionChanged">
            <TabItem x:Name="tbi1" Header="TabItem">
                <Grid Background="#FFE5E5E5">
                    <Label x:Name="lbl" Content="Label" Margin="196,86,172,148"/>
                    <ComboBox HorizontalAlignment="Left" Margin="51,162,0,0" VerticalAlignment="Top" Width="120">
                        <ComboBoxItem Content="ComboBoxItem"/>
                        <ComboBoxItem Content="ComboBoxItem"/>
                        <ComboBoxItem Content="ComboBoxItem"/>
                    </ComboBox>
                </Grid>
            </TabItem>
            <TabItem x:Name="tbi2" Header="TabItem">
                <Grid Background="#FFE5E5E5"/>
            </TabItem>
        </TabControl>

编辑: 另外,当我将鼠标悬停在选项卡项目内的任何控件上时,也会出现这个问题,因为它同时悬停在选项卡项目上。
1个回答

7
在ComboBox的SelectionChanged事件中将e.Handled设置为True。
  private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            e.Handled = true;
        }

ComboBox和TabControl都是从Selector派生而来的,SelectionChanged事件是一种路由事件,因此子ComboBox的SelectionChanged会被路由到父控件TabControl。这是WPF路由事件的行为。路由事件冒泡路由是根据逻辑树进行的,如果您将一个ComboBox放在TabControl的TabItem中,当ComboBox.SelectionChanged事件被触发时,该事件将被路由到TabControl。但是,如果ComboBox不在TabControl的逻辑树中,则该事件将不会被路由到TabControl。

更新 您可以在TabControl的SelectionChanged事件中检查触发事件的对象:

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (e.OriginalSource == tb)
        {

        }
    }

谢谢,但是当悬停在选项卡中的任何控件上时,它也会发生。我应该处理选项卡控件中的所有文本框和组合框吗?它们可能有数百个... - Hassanation

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接