我已经尝试了几个小时,但它没有用。
我有一个组合框,里面有几个项目,像搜索框一样动态生成。
现在,当用户点击下拉菜单项或点击下拉菜单项时,我想捕获一个事件。
如何实现这一目标?我试图在Combobox上设置鼠标/键盘事件处理程序,但它只适用于组合框的文本框,而不是下拉列表。
感谢。
编辑: 我忘了提到我在Combobox上有自定义DataTemplate。我尝试了另一种在ComboBox.ItemContainerStyle中设置事件的方法。
我尝试了PreviewKeyDown,但没有捕获。有什么想法吗?
答案 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的HorizontalContentAlignment存在问题。当我遇到问题时,这就是我的旧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设置HorizontalContentAlignment。但是,我觉得人们不应该这样做,以使我的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)