WPF如何捕获ContextMenuClosing事件

时间:2011-03-04 17:34:28

标签: wpf contextmenu

我有以下XAML:

<Grid >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="20"/>
        </Grid.ColumnDefinitions>            
        <local:DropDownButton 
            HorizontalAlignment="Right"
            Grid.Column="2"
            Width="18"
            Style="{StaticResource OrangeButton}"   
            ContextMenuClosing="colorPallete_ContextMenuClosing"
            x:Name="btnSelectColor">            
            <Polygon Points="0,0,5,4,10,0" Fill="Black"/>                                              
            <local:DropDownButton.DropDown>
                <ContextMenu StaysOpen="True" Name="colorPallete" ContextMenuClosing="colorPallete_ContextMenuClosing">
                    <MenuItem StaysOpenOnClick="True" OverridesDefaultStyle="True" ContextMenuClosing="colorPallete_ContextMenuClosing">
                        <MenuItem.Header>
                            <local:ColorPickerPopup x:Name="colorPicker" ContextMenuClosing="colorPallete_ContextMenuClosing"/>
                        </MenuItem.Header>                                                
                    </MenuItem>                                            
                </ContextMenu>                                        
            </local:DropDownButton.DropDown>
        </local:DropDownButton>            

        <Rectangle Width="17.5" Stroke="Black" Margin="0" 
                   Fill="{DynamicResource CheckerBrush}"/>            

        <Rectangle Width="17.5" Margin="0" Name="rtcColorPreview" />
        <TextBox Margin="2,0,0,0" Grid.Column="1" 
                 Width="100" BorderThickness="0"                     
                 Text="{Binding ElementName=colorPicker, Mode=TwoWay,  Path=SelectedColorName}"/>

    </Grid>

当ContextMenu标记的colrPallete正在关闭时,不会调用事件处理程序colorPallete_ContextMenuClosing。我似乎无法弄清楚缺少什么。

请帮忙! TIA。

1 个答案:

答案 0 :(得分:2)

根据MSDN documentation ...

  

ContextMenu本身就是一个   FrameworkElement派生类,但是   ContextMenuClosing事件不会   直接由上下文菜单引发。   相反,事件是从   “拥有”上下文菜单的元素   作为一种财产,只在提出时才提出   用户尝试关闭上下文   用户界面中的菜单。

您需要调整代码,以便仅在DropDownButton上定义处理程序。如果存在嵌套的ContextMenu,则嵌套的ContextMenu显然会引发事件。

<local:DropDownButton ContextMenuClosing="colorPallete_ContextMenuClosing">
        ...                             
</local:DropDownButton>

使用Button它看起来像这样......

<Button ContextMenuClosing="ContextMenu_ContextMenuClosing">
    <Button.ContextMenu>
        <ContextMenu>
             <MenuItem Header="Go"/>
        </ContextMenu>
    </Button.ContextMenu>
 </Button>

..包含ContextMenu的{​​{1}}关闭时的位置;将引发该事件并调用该处理程序。

不确定您使用的MenuItem控件是什么,因此我无法评论DropDownButton属性是什么以及您如何嵌套DropDown