ComboBoxItem选择会触发TabControl_SelectionChanged事件

时间:2013-11-22 17:21:44

标签: c# wpf events user-interface

我在TabItem中有一个ComboBox。 问题是,当我选择任何ComoboxItem时,会触发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>

编辑: 此外,我在Tab项目中悬停任何控件时都面临着这个问题,因为它也会悬停tabitem。

1 个答案:

答案 0 :(得分:3)

在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)
        {

        }
    }