2011-03-04 100 views
2

我有以下XAML:WPF如何捕捉的ContextMenuClosing事件

<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> 

事件处理程序colorPallete_ContextMenuClosing当文本菜单标记colrPallete被关闭不会被调用。我似乎无法弄清楚缺少的东西。

请帮忙! TIA。

回答

2

MSDN documentation ...

文本菜单本身是一个 FrameworkElement的派生类,但 的的ContextMenuClosing事件不会 直接上下文菜单提高。 相反,该事件是由作为属性“拥有”上下文菜单 的 元素引发的,并且仅在用户尝试关闭UI中的上下文 菜单时引发。

您需要调整您的代码,以便像您所做的那样仅在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> 

..where当包含MenuItemContextMenu关闭;该事件将被提出并且处理程序将被调用。

不确定什么DropDownButton控制你正在使用,所以我不能评论DropDown财产是什么,以及你如何嵌套你的ContextMenu

+0

感谢您的详细解释。 – 2011-03-04 21:04:28

+0

感谢您的详细解释。 DropDownButton.DropDown只是FrameworkElement.ContextMenu的代理。按照你的建议,事件处理程序仍然没有被调用。 – 2011-03-04 21:12:33

+0

它是你的控制吗?第三方? – 2011-03-04 21:16:09