Pregunta

Me gustaría crear algunos encabezados de menú personalizados en WPF para poder tener (por ejemplo) un icono y texto en un elemento del menú.

Normalmente, al usar MenuItems, si completa el campo Encabezado con texto simple, puede agregar un acelerador usando un guión bajo.por ejemplo, _Archivo

Sin embargo, si quisiera poner un UserControl, creo que esta función se rompería, ¿cómo haría algo similar a lo siguiente?

<Menu>
<MenuItem>
    <MenuItem.Header>
    <UserControl>
        <Image Source="..." />
        <Label Text="_Open" />
    </UserControl>
    </MenuItem.Header>
</MenuItem>
...
¿Fue útil?

Solución

Creo que la propiedad Icon se adapta a tus necesidades.
Sin embargo, para responder a la pregunta original, es posible conservar la funcionalidad del Acelerador cuando redacta el contenido de su elemento de menú. Si tiene contenido anidado en un MenuItem, debe definir la propiedad AccessText explícitamente como en el primero a continuación.Cuando utiliza el formulario en línea, esto se soluciona automáticamente.

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

Otros consejos

El problema es que colocaste la imagen dentro del contenido del MenuHeader, lo que significa que perderás la tecla del acelerador.Si solo estás intentando tener una imagen en el encabezado del menú, haz lo siguiente.

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

Si desea personalizar aún más la apariencia, modifique el plantilla de control y estilo para el menú.Por experiencia, diseñar los menús y los elementos del menú es mucho más difícil que diseñar los otros controles de WPF.

En primer lugar, se podría pensar que la propiedad Icono sólo puede contener una imagen.¡Pero en realidad puede contener cualquier cosa!Descubrí esto por accidente cuando intenté establecer mediante programación la propiedad Imagen directamente en una cadena con la ruta a una imagen.¡El resultado fue que no mostraba la imagen, sino el texto real del camino!Luego descubrí que primero tenía que crear un elemento Imagen y configurarlo en la propiedad Icono.Esto me llevó a pensar que la propiedad Imagen era cualquier contenedor de contenido ubicado en el área de íconos a la izquierda del menú, y tenía razón.¡Intenté poner un botón allí y funcionó!

Esto muestra un botón con el texto "i" en el área de iconos del elemento del menú.Cuando hace clic en el botón, se activa el evento Button_Click (el evento LanguageMenu_Click NO se activa cuando hace clic en el botón).

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

Esto lleva a una alternativa para no tener que crear una imagen para el ícono, sino usar texto con una fuente de símbolo para mostrar un "ícono" simple.El siguiente ejemplo utiliza la fuente Wingdings que contiene un símbolo de disquete.Este símbolo en la fuente está asignado al carácter. <, que tiene un significado especial en XAML, por lo que tenemos que usar la versión codificada &lt; en cambio.¡Esto funciona como un sueño!A continuación se muestra un símbolo de disquete como icono en el elemento del menú:

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

@a7an:Ah, no me di cuenta de la propiedad Icon antes.Ese es un buen comienzo.

Sin embargo, específicamente quería agregar un 'botón' adicional a algunos elementos del menú para poder tener una función 'Fijar' (consulte la lista de Documentos cargados recientemente en Office 2007 para conocer la idea de la característica).

Dado que también es necesario que haya código, ¿probablemente tendré que subclasificar el control y agregar el código para el botón?(No tengo miedo de alterar la plantilla MenuItem, ¡ya tuve que hacerlo una vez y lo haría de nuevo si fuera necesario!;) )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top