2011-03-04 3 views
2

je le XAML suivant:WPF Comment attraper événement 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> 

Le gestionnaire d'événements colorPallete_ContextMenuClosing n'est pas appelé lorsque ContextMenu marqué colrPallete ferme. Je n'arrive pas à comprendre ce qui manque.

Aidez s'il vous plaît! TIA.

Répondre

2

par le MSDN documentation ...

ContextMenu lui-même est une classe dérivée FrameworkElement , mais l'événement ContextMenuClosing ne sera pas être soulevée par un menu contextuel directement. Au lieu de cela, l'événement est déclenché à partir de l'élément qui "possède" le menu contextuel en tant que propriété et n'est levé que lorsqu'un utilisateur tente de fermer un menu contextuel dans l'interface utilisateur.

Vous devrez ajuster votre code afin que le gestionnaire est défini uniquement sur la DropDownButton que vous avez fait. S'il y a un ContextMenu imbriqué alors le ContextMenu imbriqué soulèvera évidemment l'événement.

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

L'utilisation d'un Button il ressemblerait à ceci ...

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

..where lorsque le ContextMenu contenant le MenuItem ferme; l'événement sera levé et le gestionnaire sera appelé.

Vous ne savez pas quel est le contrôle DropDownButton que vous utilisez, donc je ne peux pas commenter ce que la propriété DropDown est et comment vous imbriquez votre ContextMenu.

+0

Merci pour l'explication détaillée. –

+0

Merci pour l'explication détaillée. DropDownButton.DropDown est juste un proxy à FrameworkElement.ContextMenu. Après avoir fait ce que vous avez suggéré, le gestionnaire d'événements n'est toujours pas appelé. –

+0

Est-ce votre contrôle? 3ème partie? –

Questions connexes