Domanda

Mi piacerebbe creare alcuni MenuHeaders personalizzati in WPF in modo da poter avere (ad esempio) un'icona e un testo in una voce di menu.

Normalmente utilizzando MenuItems, se compili il campo Intestazione con testo semplice, puoi aggiungere un acceleratore utilizzando un carattere di sottolineatura.ad esempio, _File

Tuttavia, se volessi inserire un UserControl, credo che questa funzione si interromperebbe, come potrei fare qualcosa di simile al seguente?

<Menu>
<MenuItem>
    <MenuItem.Header>
    <UserControl>
        <Image Source="..." />
        <Label Text="_Open" />
    </UserControl>
    </MenuItem.Header>
</MenuItem>
...
È stato utile?

Soluzione

Penso che la proprietà Icon sia adatta alle tue esigenze.
Tuttavia, per rispondere alla domanda iniziale, è possibile mantenere la funzionalità dell'acceleratore quando componi il contenuto della tua voce di menu. Se hai contenuto nidificato in un MenuItem devi definire esplicitamente la proprietà AccessText come nel primo qui sotto.Quando usi il modulo in linea, questo viene gestito automaticamente.

 <Menu> 
   <MenuItem>
      <MenuItem.Header>
        <StackPanel Orientation="Horizontal">
          <Image Source="Images/Open.ico" />      
          <AccessText>_Open..</AccessText>
        </StackPanel>
      </MenuItem.Header>
    </MenuItem>
    <MenuItem Header="_Close" />
   </Menu>

Altri suggerimenti

Il problema è che hai inserito l'immagine all'interno del contenuto di MenuHeader, il che significa che perderai il tasto acceleratore.Se stai solo cercando di avere un'immagine nell'intestazione del menu, procedi come segue.

<MenuItem Header="_Open">
  <MenuItem.Icon>
    <Image Source="images/Open.png"/>
  </MenuItem.Icon>
</MenuItem>

Se desideri personalizzare ulteriormente l'aspetto grafico, modifica il file controltemplate e stile per il menu.Per esperienza, lo stile dei menu e delle voci di menu è molto più difficile rispetto allo stile degli altri controlli WPF.

A prima vista, penseresti che la proprietà Icon possa contenere solo un'immagine.Ma in realtà può contenere qualsiasi cosa!L'ho scoperto per caso quando ho provato a livello di codice a impostare la proprietà Image direttamente su una stringa con il percorso di un'immagine.Il risultato è stato che non veniva mostrata l'immagine, ma il testo vero e proprio del percorso!Poi ho scoperto che dovevo prima creare un elemento Image e impostarlo sulla proprietà Icon.Questo mi ha portato a pensare che la proprietà Image fosse semplicemente un qualsiasi contenitore di contenuto che si trova nell'area delle icone a sinistra nel menu, e avevo ragione.Ho provato a mettere un pulsante lì e ha funzionato!

Questo mostra un pulsante con il testo "i" nell'area Icona della voce di menu.Quando si fa clic sul pulsante, viene attivato l'evento Button_Click (L'evento LanguageMenu_Click NON viene attivato quando si fa clic sul pulsante).

<MenuItem Name="LanguageMenu" Header="_Language" Click="LanguageMenu_Click">
  <MenuItem.Icon>
    <Button Click="Button_Click">i</Button>
  </MenuItem.Icon>
</MenuItem>

Ciò porta ad un'alternativa per non dover creare un'immagine per l'icona, ma utilizzare invece il testo con un carattere simbolico per visualizzare una semplice "icona".L'esempio seguente utilizza il carattere Wingdings che contiene un simbolo di disco floppy.Questo simbolo nel carattere è mappato sul carattere <, che ha un significato speciale in XAML, quindi dobbiamo utilizzare la versione codificata &lt; Invece.Funziona come un sogno!Di seguito viene mostrato il simbolo di un dischetto come icona nella voce di menu:

<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
  <MenuItem.Icon>
    <Label VerticalAlignment="Center" HorizontalAlignment="Center" 
           FontFamily="Wingdings">&lt;</Label>
  </MenuItem.Icon>                
</MenuItem>

@a7an:Ah, non avevo notato prima la proprietà Icon.È un buon inizio.

Tuttavia, in particolare, volevo aggiungere un "pulsante" extra ad alcuni MenuItems in modo da poter avere una funzione "Pin" (vedere l'elenco dei documenti caricati di recente in Office 2007 per l'idea della funzionalità).

Poiché è necessario che ci sia anche del codice, probabilmente dovrò creare una sottoclasse del controllo e aggiungere il codice per il pulsante?(Non ho paura di fare confusione con il modello MenuItem, ho già dovuto farlo una volta e lo rifarei se dovessi!;) )

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top