2009-03-13 21 views
9

Sto cercando di modificare lo stile predefinito del ContextMenu in WPF.Default ContextMenu Style - WPF

Normalmente è possibile creare una copia del valore predefinito in Expression Blend utilizzando l'opzione Modifica parti di controllo (modello)> Modifica un menu Copia. Tuttavia non riesco a capire come farlo con un ContextMenu. Qualche idea su come posso modificare lo stile predefinito?

Sto tentando di disattivare il lato sinistro del menu di scelta rapida in cui vengono normalmente visualizzate le icone.

Grazie!

Aggiornamento: Forse non ero chiaro sulla rimozione delle icone. Ad esempio, se si dispone di un menu di scelta rapida senza icone, l'intero lato sinistro del menu è sprecato. Vorrei modificare lo stile predefinito dello sfondo del menu contestuale per rimuoverlo. Semplicemente non so come accedere a questo stile predefinito.

+0

Luke, hai risolto questo problema? Sono un po 'confuso da tutte quelle idee diverse qui sotto. Grazie per qualsiasi suggerimento! –

+0

Sì, ho usato la risposta qui sotto per ottenere il modello e l'ho modificato da lì. – Luke

risposta

10

Per modelli e stili che non sono accessibili attraverso l'interfaccia di espressione (ad esempio il modello ContextMenu) è possibile utilizzare il seguente codice per estrarre il modello:

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) 

O in C#

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

Si prega di notare che per ottenere un modello in un ContextMenu devi almeno aggiungere un MenuItem alla sua collezione di Articoli. In caso contrario, ContextMenu.Template è nullo. –

+0

I love Stack Overflow. Grazie mille per queste risposte, esattamente quello di cui avevo bisogno anche io. – scobi

2

In realtà lo spazio non fa parte di ContextMenu fa parte di MenuItem. Quindi trascina un oggetto Menu alla tua finestra in una combinazione di espressioni e crea una copia del controllo. Spero che la vostra dichiarazione ContextMenu è la seguente

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

E dentro il vostro MenuItem ControlTemplate si può vedere lo spazio come muggito. Quindi rimuovi l'icona e la prima colonna della griglia che ho segnato nella schermata.

alt text

+0

Beh, questo mi porta lo stile predefinito per il MenuItem, tuttavia non mi dà lo stile ContextMenu. Expression Blend non mi consente di aggiungere un ContextMenu alla finestra. – Luke

+0

Mostra un errore, "ContextMenu non può avere genitore logico o visivo" se aggiungo il ContextMenu alla finestra. – Luke

+0

Sì, ci sono anche gli stili all'interno di ContextMenu per il menu sul lato sinistro che è necessario rimuovere. Sono gli stili ContextMenu a cui non riesco ad accedere utilizzando l'interfaccia di Expression. Ho pubblicato una soluzione qui sotto per estrarre il modello usando il codice. – Luke

0

Lo spazio in più a sinistra è dovuta al piccolo segno di spunta che compare quando si imposta IsCheckable e IsChecked a true su MenuItem.

Il segno di spunta è nel modello per MenuItem, quindi se lo modifichi lo puoi estrarre.

+0

La proprietà 'IsCheckable' influenza l'interazione dell'utente con una voce di menu, non se l'area di controllo/icona è mostrata nel menu. In effetti, il valore predefinito è già 'False'. Impostandolo su 'True', basta semplicemente selezionare il segno di spunta per passare automaticamente ogni volta che l'utente seleziona quella voce di menu. –

7

Ho trovato il modo semplice per ottenere il modello ContextMenu in Blend:

  1. Ho aggiunto un ContextMenu a un butto n con alcuni menuitems.
  2. Sotto "Varie" nel riquadro delle proprietà, c'è un elemento raggruppato per ContextMenu.
  3. Aprire questo. Troverai le solite proprietà di stile e modello.
  4. Fare clic sul quadrato per il menu a comparsa e selezionare Converti in nuova risorsa ...

Questo è tutto. Scegli dove vuoi inserire il modello/lo stile e il gioco è fatto.

Ecco il markup che ho avuto:

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

E lo stile/modello che ho ottenuto:

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

Spero che questo aiuti. Nella solita accuratezza MS, i pennelli nello stile predefinito non vengono trovati. :)

+0

Ha ha !: * Ho trovato il modo più semplice per ottenere il modello ContextMenu in Blend * - che sicuramente sembra il modo più semplice! – bgmCoder

+3

Sembra non essere un XAML completo. Dov'è la definizione di "ContextMenuControlTemplate1"? –

2

Prova questo: (Inserisci questo codice nella sezione Risorse del tuo XAML) Questo dovrebbe rimuovere la striscia di icone dal menu di scelta rapida.

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