2016-12-12 2 views
1

Ich verwende ein ContextMenu mit Schaltflächen darin. Immer wenn die spezielle Schaltfläche gedrückt wird, möchte ich das ContextMenu geschlossen werden. Ich habe eine Möglichkeit für ein MenuItem gesehen, das "StaysOpenOnClick" heißt. Das funktioniert ganz gut.WPF-Schaltfläche in ContextMenu benötigt AufenthalteOpenClick

Das ist, was ich für den Button brauche. Besonders eine XAML-Lösung wäre schön, wenn jemand helfen könnte!

Vielen Dank im Voraus.

+0

Wie sieht Ihre XAML aussehen wie jetzt? –

Antwort

0

Sie die ContextMenu durch animieren seiner IsOpen Eigenschaft mit einem BooleanAnimationUsingKeyFrames schließen können. Dies ist eine XAML einzige Lösung:

<Grid Background="Yellow" Width="50" Height="50"> 
    <Grid.Resources> 
     <Storyboard x:Key="sb"> 
      <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen"> 
       <DiscreteBooleanKeyFrame KeyTime="0" Value="False" /> 
      </BooleanAnimationUsingKeyFrames> 
     </Storyboard> 
    </Grid.Resources> 
    <Grid.ContextMenu> 
     <ContextMenu x:Name="contextMenu"> 
      <MenuItem> 
       <MenuItem.Header> 
        <Button Content="TheButton" Click="OnButtonClick" /> 
       </MenuItem.Header> 
      </MenuItem> 
      <ContextMenu.Triggers> 
       <EventTrigger RoutedEvent="ButtonBase.Click"> 
        <BeginStoryboard Storyboard="{StaticResource sb}" /> 
       </EventTrigger> 
      </ContextMenu.Triggers> 
     </ContextMenu> 
    </Grid.ContextMenu> 
</Grid> 

Diese Lösung funktioniert, aber die ContextMenu wird jetzt für alle Tasten in meinem ContextMenu geschlossen. Ich wollte nur, dass es mit nur einem Knopf "Einstellungen" geschlossen wird.

In diesem Fall können Sie die Source Eigenschaft des Eventtrigger auf die x einstellen könnten: Name der „Einstellung“ Button:

<Grid Background="Yellow" Width="50" Height="50"> 
     <Grid.Resources> 
      <Storyboard x:Key="sb"> 
       <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen"> 
        <DiscreteBooleanKeyFrame KeyTime="0" Value="False" /> 
       </BooleanAnimationUsingKeyFrames> 
      </Storyboard> 
     </Grid.Resources> 
     <Grid.ContextMenu> 
      <ContextMenu x:Name="contextMenu"> 
       <MenuItem> 
        <MenuItem.Header> 
         <Button Content="Settings" x:Name="settingsButton" /> 
        </MenuItem.Header> 
       </MenuItem> 
       <MenuItem> 
        <MenuItem.Header> 
         <Button Content="About" /> 
        </MenuItem.Header> 
       </MenuItem> 
       <ContextMenu.Triggers> 
        <EventTrigger RoutedEvent="ButtonBase.Click" SourceName="settingsButton"> 
         <BeginStoryboard Storyboard="{StaticResource sb}" /> 
        </EventTrigger> 
       </ContextMenu.Triggers> 
      </ContextMenu> 
     </Grid.ContextMenu> 
</Grid> 
+0

zu entfernen. Ich schätze, Sie brauchen das Click Event für die Schaltfläche nicht. Wie auch immer, diese Lösung funktioniert, aber das ContextMenu wird jetzt für alle Buttons in meinem ContextMenu geschlossen. Ich wollte nur, dass es mit nur einem Knopf "Einstellungen" geschlossen wird. – user1818797

+0

Bitte sehen Sie meine bearbeitete Antwort. Bitte denken Sie auch daran zu akzeptieren und abzustimmen, wenn es Ihnen hilft :) – mm8

+0

Das funktioniert für mich .. vielen Dank! :) – user1818797

0

Ich bin nicht ganz sicher, was Sie nach, aber hier ist ein Kontextmenü mit einem Knopf:

<TextBlock 
    Text="Hello, world!"> 
    <TextBlock.ContextMenu> 
     <ContextMenu x:Name="contextMenu"> 
      <MenuItem> 
       <MenuItem.Header> 
        <Button Content="MyButton" Click="OnMenuButtonClick" /> 
       </MenuItem.Header> 
      </MenuItem> 
     </ContextMenu> 
    </TextBlock.ContextMenu> 
</TextBlock> 

Wenn Sie auf den Button klicken behandeln, wie folgt, wird es über das Kontextmenü schließen:

private void OnMenuButtonClick(object sender, RoutedEventArgs e) 
{ 
    contextMenu.IsOpen = false; 
} 

(keine XAML-only Lösung, though.)

+0

Wenn Sie die Schaltfläche zum Umschalten der Schaltfläche ändern, sollten Sie in der Lage sein, an die IsOpen-Eigenschaft zu binden und den Code hinter – MikeT