C# 上下文菜单打开时,上下文菜单外部的控件不会在单击时被命中

C# 上下文菜单打开时,上下文菜单外部的控件不会在单击时被命中,c#,wpf,menu,popup,contextmenu,C#,Wpf,Menu,Popup,Contextmenu,我有一个按钮,点击它会打开一个关联菜单。我在同一个stackpanel上有另一个按钮,当上下文菜单通过按钮2单击打开时,单击按钮1不会第一次触发按钮1的事件,但当再次单击时,会触发事件。简单地说,当按钮2的上下文菜单打开时,我需要点击2下才能触发窗口上按钮1的事件 以下是更多了解的代码: MainWindow.xaml <Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown"> <Grid.RowDefinit

我有一个按钮,点击它会打开一个关联菜单。我在同一个stackpanel上有另一个按钮,当上下文菜单通过按钮2单击打开时,单击按钮1不会第一次触发按钮1的事件,但当再次单击时,会触发事件。简单地说,当按钮2的上下文菜单打开时,我需要点击2下才能触发窗口上按钮1的事件

以下是更多了解的代码:

MainWindow.xaml

<Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown">  
        <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions> 
<StackPanel Grid.Row = "0" Orientation="Horizontal">
       <Button x:Name= "btnOne" Click="btnOneClick"/>  
       <Button x:Name="btnTwo" 
                            RenderOptions.BitmapScalingMode="HighQuality" Cursor="Hand"  ContextMenuService.IsEnabled="False" Click="btnTwoClick">
                        <Button.Triggers>
                            <EventTrigger RoutedEvent="Button.Click">
                                <EventTrigger.Actions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <BooleanAnimationUsingKeyFrames 
                                 Storyboard.TargetName="MyContextMenu" 
                                 Storyboard.TargetProperty="IsOpen">
                                                <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True" />
                                            </BooleanAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger.Actions>
                            </EventTrigger>
                        </Button.Triggers>
                        <StackPanel>
                            <StackPanel  Height="{Binding ActualHeight, ElementName=btnTwo}" Orientation="Horizontal" HorizontalAlignment="Right" >
                                <TextBlock  HorizontalAlignment="Right" Text="Click Me" ></TextBlock>                         
                            </StackPanel>                            
                        </StackPanel>
                        <Button.ContextMenu>
                            <ContextMenu x:Name="MyContextMenu"  StaysOpen="False"  Width="200" MaxHeight="258"
                                         BorderBrush="Gray" BorderThickness="1,0,1,1" Closed="MyContextMenuClosed">
                                <MenuItem Header="MenuOne" StaysOpenOnClick="True" Cursor="Arrow"/>
                                <MenuItem Header="MenuTwo" StaysOpenOnClick="True" Cursor="Arrow"/>                                                               
                            </ContextMenu>
                        </Button.ContextMenu>
                    </Button>
</StackPanel>
</Grid>

我无法解释,但是如果你删除

StaysOpen="False"
在XAML中的
ContextMenu
定义中,它将按预期工作。顺便说一下,您不需要在XAML按钮的触发器和Click EventHandler中调用ContextMenu两次。

默认情况下,MSDN writes
StaysOpen
为false

如果在IsOpen特性更改为之前菜单应保持打开状态,则为true 虚假的;否则,错误。默认值为false


这是因为第一次单击会从打开的上下文菜单中删除焦点。处理预览鼠标按下事件并手动将焦点设置为按钮可能会有所帮助。这是预期的行为。您需要先关闭弹出窗口,然后才能单击按钮。@mm8您是对的,弹出窗口必须先关闭,然后调用事件处理程序,但它也可以通过单击来工作。谢谢@Rekshino。删除StaysOpen=“false”允许我只需单击一下外部控件。但后来我发现我的上下文菜单并没有通过点击按钮来关闭。所以,根据您的建议,我删除了通过按钮触发器和ClickEventHandler对上下文菜单的重复调用。我从这里()向按钮添加了下拉行为。这些变化帮助我实现了我所追求的目标。谢谢你的回答,为我指明了正确的道路。
StaysOpen="False"