单击WPF组合框项目或通过Enter键选择时如何捕获事件?

时间:2011-04-14 04:25:43

标签: wpf combobox

我已经尝试了几个小时,但它没有用。

我有一个组合框,里面有几个项目,像搜索框一样动态生成。

现在,当用户点击下拉菜单项或点击下拉菜单项时,我想捕获一个事件。

如何实现这一目标?我试图在Combobox上设置鼠标/键盘事件处理程序,但它只适用于组合框的文本框,而不是下拉列表。

感谢。

编辑: 我忘了提到我在Combobox上有自定义DataTemplate。我尝试了另一种在ComboBox.ItemContainerStyle中设置事件的方法。

                                 我尝试了PreviewKeyDown,但没有捕获。有什么想法吗?

6 个答案:

答案 0 :(得分:8)

而不是使用MouseLeftButtonDown事件, 使用PreviewMouseLeftButtonDown事件

WPF支持“事件冒泡”概念,当事件被触发时,它会冒泡实现该事件的树上的更高元素。 但是ComboBox本身已经实现了click事件。所以你必须告诉它“向下”冒泡。

答案 1 :(得分:5)

我认为您正在寻找的是“SelectionChanged”事件。一旦您在下拉列表中选择了一个项目,就可以通过鼠标单击或使用箭头键导航并点击“Enter”(我尝试成功)来提升此事件。

       <ComboBox x:Name="cbobox" ItemsSource="{Binding SourceList}" 
              SelectionChanged="cbobox_SelectionChanged">
        <ComboBox.ItemContainerStyle>
            <Style TargetType="{x:Type ComboBoxItem}">
                <Setter Property="Template" >
                    <Setter.Value>
                        <ControlTemplate>
                            <TextBlock Text="{Binding BusinessProperty}"/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ComboBox.ItemContainerStyle>
    </ComboBox>

答案 2 :(得分:2)

我也尝试了几个小时,这是我的解决方案: 订阅KeyUp事件。

不知何故,这是唯一被触发的事件,可用于区分使用自定义模板的鼠标和键盘选择。

public override void OnApplyTemplate()
{
        base.OnApplyTemplate();
        KeyUp += OnKeyUp;
}

void OnKeyUp(object sender, KeyEventArgs e)
{
        if (e.Key == Key.Down)
        {...}
        else if (e.Key == Key.Up)
        {...}
        else if(e.Key == Key.Enter)
        {...}
}

希望这也适合你。

答案 3 :(得分:0)

如果您为ComboBoxItem使用自定义ControlTemplate,则可能是ContentPresenter的Horizo​​ntalContentAlignment存在问题。当我遇到问题时,这就是我的旧ControlTemplate的样子:

<ControlTemplate TargetType="{x:Type ComboBoxItem}">
    ....
    <ContentPresenter 
        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>

以下是我解决问题的方式:

<ControlTemplate TargetType="{x:Type ComboBoxItem}">
    ....
    <ContentPresenter 
        HorizontalAlignment="Stretch" 
        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>

或者,您可以单独保留ControlTemplate并为每个ComboBoxItem设置Horizo​​ntalContentAlignment。但是,我觉得人们不应该这样做,以使我的ComboBoxItem ControlTemplate工作。

答案 4 :(得分:0)

一周后我最终得到了这个

 <StackPanel>
            <ComboBox Name="cmb" ItemsSource="{Binding Items}"   
                          SelectedValue="{Binding SelectedVale}">
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Button Content="{Binding DisplayText}" Command="{Binding ItemClick}" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}"></Button>
                        </StackPanel>
                    </DataTemplate>

                </ComboBox.ItemTemplate>
            </ComboBox>
        </StackPanel>

答案 5 :(得分:0)

尝试设置类型为DropDownClosed的事件并捕获该事件。

我在程序中对其进行了测试,似乎在关闭组合框下拉菜单之前就被调用了。

我推荐您访问this question以获得更多信息。