留下一个下拉的组合框会吞噬WPF中的焦点

本文关键字:吞噬 WPF 焦点 组合 下一个 | 更新日期: 2023-09-27 17:57:56

我有以下问题:在WPF窗口上,我放置了一个组合框和一个按钮。我放下组合框,当组合框仍然放下时,我点击按钮。该按钮对鼠标单击没有反应,但下拉组合框关闭。第二次单击鼠标后,按钮会做出反应。下面是代码示例:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="100" Width="300">
    <Grid>
        <ComboBox VerticalAlignment="Top" HorizontalAlignment="Left"
                  Width="100" IsSynchronizedWithCurrentItem="True" >
            <ComboBoxItem Content="item 1"/>
            <ComboBoxItem Content="item 2"/>
            <ComboBoxItem Content="item 3"/>
        </ComboBox>
        <Button Content="Test" VerticalAlignment="Bottom" HorizontalAlignment="Right"
                Width="100" Click="Button_Click" />
    </Grid>
</Window>

以及背后的代码:

private void Button_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Button clicked");
}

如何防止组合框吞噬按钮上的焦点?谢谢

关于mc

留下一个下拉的组合框会吞噬WPF中的焦点

此行为是有意的。它是通过创建一个面板(Canvas)来实现的,该面板的Background属性设置为Transparent,在显示包含下拉列表内容的Popup之前覆盖整个RootVisual。这样,ComboBox控件可以捕获整个RootVisual区域中的鼠标单击,并在检测到单击时关闭下拉列表。

我不建议改变这种行为,真的。它是以用户期望的方式实现的。如果您真的想改变预期的行为,可以在视图的代码隐藏(YourUserControl.xaml.cs)中的组合框中添加路由事件处理程序

MyComboBox.AddHandler(
    UIElement.MouseLeftButtonDownEvent,
    new MouseButtonEventHandler(
        (sender, e) =>
        {
            MyButton.Command.Execute(null);
        }),
    handledEventsToo: true
);