13 Stimmen

Standard ContextMenu Stil - WPF

Ich versuche, den Standardstil des ContextMenu in WPF zu ändern.

Normalerweise können Sie eine Kopie des Standards in Expression Blend erstellen, indem Sie die Menüoption Steuerteile bearbeiten (Vorlage) > Kopie bearbeiten verwenden. Ich kann jedoch nicht herausfinden, wie man dies mit einem ContextMenu macht. Irgendeine Idee, wie ich den Standardstil ändern kann?

Ich versuche, die linke Seite des Kontextmenüs zu deaktivieren, wo normalerweise die Symbole angezeigt werden.

Danke!

Aktualisierung: Vielleicht habe ich mich nicht klar ausgedrückt, was das Entfernen der Icons angeht. Wenn Sie zum Beispiel ein Kontextmenü ohne Symbole haben, dann ist die gesamte linke Seite des Menüs verschwendeter Platz. Ich würde gerne den Standardstil des Hintergrunds des Kontextmenüs ändern, um dies zu entfernen. Ich weiß nur nicht, wie ich auf diese Standardvorlage zugreifen kann.

0 Stimmen

Luke, haben Sie dieses Problem gelöst? Ich bin ein wenig verwirrt von all diesen verschiedenen Ideen unten. Danke für jeden Hinweis!

0 Stimmen

Ja, ich habe die unten stehende Antwort verwendet, um die Vorlage zu erhalten, und sie von dort aus geändert.

20voto

Luke Punkte 6025

Für Vorlagen und Stile, die nicht über die Expression-Schnittstelle zugänglich sind (z. B. die ContextMenu-Vorlage), können Sie den folgenden Code verwenden, um die Vorlage zu extrahieren:

Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder
Using Writer As TextWriter = New StringWriter(sb)
    System.Windows.Markup.XamlWriter.Save(ContextMenu.Template, Writer)
End Using
Debug.Write(sb.ToString)

Oder in C#

var str = new StringBuilder();
using (var writer = new StringWriter(str))
    XamlWriter.Save(ContextMenu.Template, writer);
Debug.Write(str);

6 Stimmen

Bitte beachten Sie, dass Sie, um eine Vorlage in einem ContextMenu zu erhalten, mindestens ein MenuItem zu seiner Items-Sammlung hinzufügen müssen. Andernfalls ist das ContextMenu.Template null.

0 Stimmen

Ich liebe Stack Overflow. Vielen Dank für diese Antworten, genau das, was ich auch brauchte.

0 Stimmen

Damit werde ich eine Menge Zeit sparen. Was für ein toller Tipp.

10voto

dex3703 Punkte 2049

Ich habe einen einfachen Weg gefunden, um die ContextMenu-Vorlage in Blend zu erhalten:

  1. Ich habe ein ContextMenu zu einer Schaltfläche mit einigen Menüpunkten hinzugefügt.
  2. Unter "Verschiedenes" im Eigenschaftsfenster gibt es ein gruppiertes Element für ContextMenu.
  3. Öffnen Sie dies. Hier finden Sie die üblichen Eigenschaften von Stil und Vorlage.
  4. Klicken Sie auf das Quadrat für das Popup-Menü, und wählen Sie In neue Ressource konvertieren...

Das war's. Wählen Sie aus, wo die Vorlage/der Stil eingefügt werden soll, und schon sind Sie fertig.

Hier ist der Aufschlag, den ich hatte:

<StackPanel x:Name="LayoutRoot">
    <Button Content="Click for ContextMenu" Width="30" HorizontalAlignment="Center" VerticalAlignment="Center">
        <Button.ContextMenu>
            <ContextMenu Template="{DynamicResource ContextMenuControlTemplate1}" Style="{DynamicResource ContextMenuStyle1}">
                <MenuItem Header="File"/>
                <MenuItem Header="Edit"/>
                <MenuItem Header="View"/>
                <MenuItem Header="Recent Files"/>
                    <MenuItem Header="file1.txt"/>
                    <MenuItem Header="file2.txt"/>
            </ContextMenu>
        </Button.ContextMenu>
    </Button>
</StackPanel>

Und der Stil/die Vorlage, die ich bekommen habe:

<Style x:Key="ContextMenuStyle1" TargetType="{x:Type ContextMenu}">
    <Setter Property="Background" Value="{DynamicResource MenuBackgroundBrush}"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="BorderBrush" Value="{DynamicResource WindowBorderBrush}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ContextMenu}">
                <Border Uid="Border_93">
                    <Border.Style>
                        <Style TargetType="{x:Type Border}">
                            <Setter Property="Tag" Value="{DynamicResource {x:Static SystemParameters.DropShadowKey}}"/>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="True">
                                    <Setter Property="Background" Value="Transparent"/>
                                    <Setter Property="Padding" Value="0,0,5,5"/>
                                    <Setter Property="Effect">
                                        <Setter.Value>
                                            <DropShadowEffect BlurRadius="4" Opacity="0.8" ShadowDepth="1"/>
                                        </Setter.Value>
                                    </Setter>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Border.Style>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Ich hoffe, das hilft. In gewohnter MS-Gründlichkeit werden die Pinsel im Standardstil nicht gefunden :)

0 Stimmen

Ha ha!: Ich habe einen einfachen Weg gefunden, um die ContextMenu-Vorlage in Blend zu erhalten - Das scheint der einfachste Weg zu sein!

7 Stimmen

Scheint kein vollständiges XAML zu sein. Wo ist die Definition von 'ContextMenuControlTemplate1'?

4voto

Jonathan Perry Punkte 2783

Versuchen Sie Folgendes: (Fügen Sie diesen Code in den Ressourcenteil Ihrer XAML ein) Dies sollte den Symbolstreifen aus dem Kontextmenü entfernen.

<Style TargetType="{x:Type ContextMenu}">
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ContextMenu}">
                <Border BorderThickness="1" CornerRadius="4" BorderBrush="Black" x:Name="Border" Background="White">
                    <StackPanel ClipToBounds="True" Orientation="Vertical" IsItemsHost="True" />
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter TargetName="Border" Property="Background" Value="White" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

1voto

Jobi Joy Punkte 47482

Das Leerzeichen ist nicht Teil des ContextMenu, sondern Teil von MenuItem. Ziehen Sie also einfach ein MenuItem in Ihr Fenster in Expression Blend und erstellen Sie eine Kopie des Controls. Hoffentlich sieht Ihre ContextMenu-Deklaration wie folgt aus

 <ContextMenu  >
    <MenuItem Header="Copy"/>
    <MenuItem Header="Paste"/>
    <MenuItem Header="Clear"/>
 </ContextMenu>

Und in Ihrem MenuItem ControlTemplate können Sie den Raum wie unten sehen. Entfernen Sie also das Symbol und die erste Spalte des Rasters, die ich im Screenshot markiert habe.

alt text

0 Stimmen

Nun, das bekommt mir die Standardvorlage für das MenuItem, aber es bekommt mir nicht die ContextMenu-Vorlage. Expression Blend wird nicht lassen Sie mich ein ContextMenu zum Fenster hinzufügen.

0 Stimmen

Es wird der Fehler "ContextMenu cannot have logical or visual parent" angezeigt, wenn ich das ContextMenu zum Fenster hinzufüge.

1 Stimmen

Ja, es gibt auch Stile im ContextMenu für das linke Seitenmenü, die entfernt werden müssen. Es sind die ContextMenu-Stile, auf die ich über die Expression-Schnittstelle nicht zugreifen kann. Ich habe unten eine Lösung zum Extrahieren der Vorlage mit Code veröffentlicht.

-1voto

Robert Macnee Punkte 11480

Der zusätzliche Platz auf der linken Seite ist auf das kleine Häkchen zurückzuführen, das erscheint, wenn Sie die IsCheckableIsChecked zu true auf MenuItem .

Das Häkchen ist in der Vorlage für MenuItem Wenn Sie das also bearbeiten, können Sie es herausnehmen.

0 Stimmen

Les IsCheckable wirkt sich auf die Benutzerinteraktion mit einem Menüpunkt aus, nicht darauf, ob der Kontroll-/Symbolbereich im Menü angezeigt wird. In der Tat ist der Standardwert bereits False . Einstellung auf True wird das Häkchen einfach jedes Mal automatisch umgeschaltet, wenn der Benutzer diesen Menüpunkt auswählt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X