WPF组合框PreviewMouseDown

时间:2019-06-27 18:26:48

标签: c# .net wpf combobox

我有一个可编辑的组合框和一个文本框。

    <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="86,149,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
    <ComboBox x:Name="comboBox" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" Margin="282,150,0,0" IsEditable="True" PreviewMouseDown="ComboBox_PreviewMouseDown"/>

我不明白,当焦点位于文本框上并单击组合框时,为什么ComboBox_PreviewMouseDown不触发。它只是突出显示组合框中的文本并设置焦点。在组合框已经具有焦点时单击组合框时,将触发PreviewMouseDown。这是发生在这里吗?为什么没有焦点的组合框中的PreviewMouseDown无法正常工作?

2 个答案:

答案 0 :(得分:1)

将ComboBox.IsEditable'设置为True时,ComboBox在内部将焦点(和键盘焦点)设置为编辑TextBox,以使其立即可用于文本输入。这完全是有道理的,因为单击编辑TextBox的目的总是要输入或编辑一些文本。否则,用户将不得不单击两次TextBox才能使其获得文本输入的焦点(键盘焦点)。

要实现预期的行为,您必须处理UIElement.PreviewGotKeyboardFocus上的Keyboard.PreviewGotKeyboardFocus事件或附加的ComboBox事件。

答案 1 :(得分:-1)

我本人也遇到了同样的问题。一个简单有效的解决方法是将ComboBox包装在轻量级ContentPresenter中,然后将PreviewMouseDown处理程序附加到该处理程序上,如下所示:

<ContentPresenter x:Name="MyComboBoxWrapper"
    PreviewMouseDown="MyComboBoxWrapper_PreviewMouseDown">

    <ContentPresenter.Content>
        <ComboBox x:Name="MyComboBox" />
    </ContentPresenter.Content>

</ContentPresenter>

此外,由于此控件在PreviewMouseDown之前获得了ComboBox事件,因此,您不仅可以在ComboBox看到事件之前使用它来预处理事件,还可以通过将事件arg的ComboBox属性设置为'true,完全切断handled

像魅力一样工作!不需要子类化或其他技巧,只需要树中的轻量级控件即可!

注释

正如某些人所考虑的那样,从技术上讲,您可以将PreviewMouseDown事件附加到ComboBox任何祖先,但是您可能必须在该处理程序中添加逻辑以确定您实际上是在点击ComboBox还是其他内容。

通过使用显式ContentPresenter(一种本身没有任何渲染逻辑的轻量级元素,它仅承载其他元素),您现在拥有了专门用于此控件的PreviewMouseDown处理程序。另外,由于这两个物品可以一起旅行,因此它在您需要移动时更加轻便。