2016-11-20 6 views
0

Ich versuche, ein etwas komplexes Menüelement zu erstellen, mit dem ein Benutzer eine neue Klasse erstellen kann. Das Problem, in dem ich ausgeführt werde, ist, dass, wenn ich auf ein numerisches up-down (aus dem xceed toolkit) klicke, der Menüeintrag schließt, selbst wenn die Eigenschaft StaysOpenOnClick auf true gesetzt ist.Wie kann ich einen Menüunterpunkt offen halten?

Benutzer werden das nicht mögen.

zu reproduzieren, ein WPF-Projekt erstellen und die Extended WPF Toolkit durch NuGet hinzufügen, löschen Sie dann den folgenden Code in Ihre Hauptfenster Klasse:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:WhyDoesMyMenuItemCloseWhenClicked" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" 
    mc:Ignorable="d" 
    x:Class="WhyDoesMyMenuItemCloseWhenClicked.MainWindow" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="21"/> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <Menu FontWeight="Bold"> 
      <MenuItem Header="_File"> 
       <MenuItem StaysOpenOnClick="True"> 
        <Grid Height="50" Width="50"> 
         <xctk:IntegerUpDown/> 
        </Grid> 
       </MenuItem> 
      </MenuItem> 
     </Menu> 
    </Grid> 
</Window> 

Wenn ich das Textfeld der Integer-up-down klicken, Das Menü wird geschlossen.

Warum passiert das immer? Wie kann ich es machen NICHT passieren?

+0

zu erreichen Wenn Sie das Textfeld eingeben, gibt als nur ein Klick mehr los wird. Ein anderes Element als das Menü erhält volle Tastaturbelegung/Fokus, was wahrscheinlich eine völlig andere Kette von Ereignissen auslöst. Sie könnten versuchen, Änderungen an IsSubMenuOpen abzufangen und sie abzubrechen oder umzukehren, aber meine Versuche führten zu einem inakzeptablen Verhalten. Obwohl es in der Tat blieb offen. – Daniel

+0

Noch etwas, Sie könnten versuchen, die Vorlage des MenuItems zu einer Ressource zu extrahieren und diese (im Popup) durch eine Variable zu ersetzen: IsOpen = "{Binding IsSubmenuOpen, RelativeSource = {RelativeSource TemplatedParent}}" – Daniel

+0

Ja, sogar den gesamten Baum zu erzwingen Wenn Menüs weiterhin offen bleiben, führt dies zu einem inakzeptablen Verhalten. Ein Teil des Menüs entfernt den Fokus stark vom Textfeld. Das ist ein bisschen mehr, als ich an einem Sonntag untersuchen möchte, aber ich wünsche Ihnen viel Glück. Ich hoffe, das obige hat dir irgendwie geholfen. – Daniel

Antwort

0

Ich habe eine Lösung gefunden. Es ist eine Art schrecklich hacky Abhilfe, aber es macht den Job ganz gut:

Die Änderung ist, dass Sie eine MenuItem innerhalb der MenuItem erstellen. Dann definieren Sie Ihr Steuerelement in der Eigenschaft MenuItemMenuItem.Header Eigenschaft und setzen MenuItemStaysOpenOnClick Eigenschaft auf True.

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:WhyDoesMyMenuItemCloseWhenClicked" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" 
    mc:Ignorable="d" 
    x:Class="WhyDoesMyMenuItemCloseWhenClicked.MainWindow" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="21"/> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <Menu FontWeight="Bold"> 
      <MenuItem Header="_File" StaysOpenOnClick="True"> 
       <MenuItem Header="_StaysOpenOnClick"> 
        <MenuItem StaysOpenOnClick="True"> 
         <MenuItem.Header> 
          <xctk:IntegerUpDown/> 
         </MenuItem.Header> 
        </MenuItem> 
       </MenuItem> 
      </MenuItem> 
     </Menu> 
    </Grid> 
</Window> 
-1

können Sie nutzen StaysOpenOnClick Eigentum machen diese

+0

Versuchen Sie es. Es funktioniert nicht. Sie müssen Ihren Inhalt in der Kopfzeile eines Menüeintrags erstellen und diesen Menüeintrag innerhalb des Menüeintrags platzieren, der geöffnet bleiben soll. Wenn Sie die Eigenschaft des eingebetteten Menüelements auf "True" setzen, wird der gewünschte Effekt erzielt, wie in der obigen Antwort angegeben. – Will

Verwandte Themen