2012-12-23 14 views
5

Utworzyłem niestandardowe menu kontekstowe, w którym zmieniłem wygląd wszystkich elementów. Elementy te zawierają różne elementy sterujące, takie jak pola combobox i przyciski. Teraz chcę zamknąć menu po naciśnięciu przycisku lub wybraniu elementu combobox. Obecnie menu pozostaje otwarte. Czy możesz dać mi wskazówkę?Zamykanie menu kontekstowego z szablonem MenuItems

To jest uproszczony kod, aby pokazać, co zrobiłem:

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

Jak wspomniano, chciałbym, aby zamknąć menu kiedy uderzył przycisk OK.

UPDATE

Poniższy przycisk (lub jakakolwiek inna kontrola) załatwia sprawę bez konieczności zmieszanych 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> 

Odpowiedz

3

Skorzystaj z ChangePropertyAction która jest częścią Blend SDK zmienić IsOpen właściwość ContextMenu zaraz po kliknięciu przycisku:

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

Będziesz potrzebował następujących nazw:

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

podoba mi się pomysł, jednak próbka nie działa od TargetObject nie może być ElementName poza ControlTemplate, więc użyłem RelativeSource za to. Jednak do mojego pierwszego posta dodałem rozwiązanie bez Blend. – Jaster

+0

Poprawnie - Zaktualizowana odpowiedź z RelativeSource (dla przyszłych referencji ...) – Blachshma

Powiązane problemy