我有一个可编辑的组合框和一个文本框。
<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无法正常工作?
答案 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
处理程序。另外,由于这两个物品可以一起旅行,因此它在您需要移动时更加轻便。