2012-12-23 18 views
5

Ho creato un menu contestuale personalizzato in cui ho cambiato l'aspetto di tutti gli elementi. Questi articoli contengono controlli diversi come caselle combinate e pulsanti. Ora voglio che il menu si chiuda se è stato premuto un pulsante o se è stato selezionato un oggetto combobox. Attualmente il menu rimane aperto. Puoi darmi un suggerimento?Chiusura Menu Contesto con Menu Menu Templati

Si tratta di un codice semplificato per mostrare quello che ho fatto:

<ContextMenu StaysOpen="False"> 
    <MenuItem> 
     <MenuItem.Template> 
      <ControlTemplate> 
       <Grid MinWidth="200"> 
        <Button Command="{Binding SomeWorkingCommandBinding}">OK</Button> 
       </Grid> 
      </ControlTemplate> 
     </MenuItem.Template> 
    </MenuItem> 
</ContextMenu> 

Come accennato, vorrei chiudere il menu quando ho colpito quel pulsante OK.

UPDATE

Il seguente pulsante (o qualsiasi altro controllo) fa il trucco, senza la necessità di Miscela SDK:

<Button.Triggers> 
    <EventTrigger RoutedEvent="Button.Click"> 
     <BeginStoryboard> 
      <Storyboard> 
       <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(ContextMenu.IsOpen)" Storyboard.Target="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}"> 
        <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
         <DiscreteObjectKeyFrame.Value> 
          <sys:Boolean>False</sys:Boolean> 
         </DiscreteObjectKeyFrame.Value> 
        </DiscreteObjectKeyFrame> 
       </ObjectAnimationUsingKeyFrames> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
</Button.Triggers> 

risposta

3

Utilizzare il ChangePropertyAction che fa parte del Blend SDK per cambiare il IsOpen proprietà del ContextMenu non appena si fa clic sul pulsante:

<ContextMenu x:Name="MyContextMenu"> 
    <MenuItem> 
    <MenuItem.Template> 
     <ControlTemplate> 
      <Grid MinWidth="200"> 
       <Button Command="{Binding SomeWorkingCommandBinding}" Content="OK"> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="Click"> 
          <ei:ChangePropertyAction TargetObject="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}" PropertyName="IsOpen" Value="False"/> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
       </Button> 
      </Grid> 
     </ControlTemplate> 
    </MenuItem.Template> 
    </MenuItem> 
</ContextMenu> 

Hai bisogno dei seguenti spazi dei nomi:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"     
xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 
+0

Mi piace l'idea, ma il campione non funziona in quanto la TargetObject non può essere un ElementName di fuori del ControlTemplate, così ho usato un RelativeSource per questo. Tuttavia ho aggiunto una soluzione senza Blend al mio post iniziale. – Jaster

+0

Corretto - Risposta aggiornata con RelativeSource (per riferimenti futuri ...) – Blachshma

Problemi correlati