2016-10-31 4 views
0

Ich habe ein Problem - in Code hinter Ich füge Sammlung von MenuItems hinzu, eine von ihnen hat eine StackPanel als Header. Es gibt eine Button in StackPanel, die das ganze ContextMenu schließen soll, aber leider nicht. Jede Hilfe wäre willkommen.Button im contextMenü menuItem

Codebeispiel:

var itemB = new MenuItem(); 
var stackPanel = new StackPanel() { Orientation = Orientation.Horizontal }; 
var textBox = new TextBox() { Width = 60 }; 
var button = new Button() { Content = "Ok", Width = 60 }; 
stackPanel.Children.Add(textBox); 
stackPanel.Children.Add(button); 
itemB.Header = stackPanel; 

//1st approach - doesn't work, I can only get access to MenuItem Header 
button.Click += (sender, e) => 
{ 
    FrameworkElement fe = sender as FrameworkElement; 
    while (fe != null) 
    { 
     if (fe is ContextMenu) 
     { 
      (fe as ContextMenu).IsOpen = false; 
      break; 
     } 
     fe = fe.Parent as FrameworkElement; 
    } 
}; 

//2nd approach - doesn't work, I can only get access to MenuItem Header 
itemB.PreviewMouseUp += (sender, e) => 
{ 
    ((MenuItem)((MenuItem)sender).Parent).IsSubmenuOpen = false; 
}; 

Ich habe ähnliche Artikel gefunden, aber kein Erfolg:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/17603d7e-b76b-45b5-a2df-2f3b378b690c/force-button-inside-contextmenu-to-close-contextmenu?forum=wpf

WPF: button inside MenuItem, closing the menu

Is there a way to programatically close a menuitem in WPF

+0

Gibt es Neuigkeiten? Ich habe eine Antwort geschrieben, ich würde gerne wissen, ob es für Sie funktioniert oder ob Sie eine andere Lösung gefunden haben. –

+0

@Massimiliano Hallo! Danke für die Antwort. So funktioniert es, aber in meinem Fall ContextMenu ist in XAML definiert und es sollte dort bleiben, wenn möglich. – niks

Antwort

0

Sie sagten, dass die ContextMenu auf XAML definiert, so lassen Sie uns einen Code wie diese annehmen:

<Grid> 
    <Grid.ContextMenu> 
    <!-- ContextMenu with a Name to be called! --> 
    <ContextMenu Name="GridContextMenu"/> 
    </Grid.ContextMenu> 
    <Button Content="Open Menu" Click="Button_Click"/> 
    <!-- other controls ... --> 
</Grid> 

Lassen Sie uns das Click-Ereignis implementieren:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var textBox = new TextBox { Width = 60 }; 

    var button = new Button { Content = "Ok", Width = 60 }; 

    var stackPanel = new StackPanel 
    { 
     Orientation = Orientation.Horizontal, 
     Children = { textBox, button }, 
    }; 

    var menuItem = new MenuItem 
    { 
     Header = stackPanel, 
    }; 

    button.Click += (s, args) => 
    { 
     GridContextMenu.IsOpen = false; 
     GridContextMenu.Items.Remove(menuItem); 
    }; 

    GridContextMenu.Items.Add(menuItem); 

    GridContextMenu.IsOpen = true; 
}