Pregunta

Estoy trabajando en algunos XAML para una aplicación WPF y estoy teniendo algunos problemas para conseguir que haga lo que yo quiero. Aquí está una muestra de mi XAML:

<!-- Tool Bar Tray -->
<ToolBarTray Name="toolBarTray1" DockPanel.Dock="Top">
    <!-- File And Edit Tools -->
    <ToolBar Name="toolBar1" Band="1" BandIndex="1">
        <!-- Regular Items -->
        <Button>A</Button>
        <Button>B</Button>
        <!-- Overflow Menu For Special Items -->
        <MenuItem ToolBar.OverflowMode="Always" Header="Special Items">
            <MenuItem Header="C"/>
            <MenuItem Header="D"/>
        </MenuItem>
    </ToolBar>
</ToolBarTray>

Cuando hago clic en el botón de desbordamiento de mi barra de herramientas, los "artículos especiales" Menultem aparece con una pequeña flecha al lado de él, lo que indica elementos anidados. Sin embargo, cuando pasa el ratón sobre "artículos especiales" o tratar de hacer clic en él, no se están visualizando los MenuItems "C" y "D".

Yo esperaba que Menultem sería simplemente trabajar fuera de un menú, pero traté de hacer lo sencillo, por si acaso. La inclusión de estos MenuItems dentro de un menú y, en cambio, dando a este menú el ToolBar.OverflowMode = "siempre" propiedad produce algo más de estilo no deseado. La flecha ya no está presente es, la entrada "artículos especiales" necesita ser hecho clic en para activar el submenú y el posicionamiento sub-menú parece un poco apagado.

¿Alguien sabe lo que está pasando?

Editar: Añadir un menú al desbordamiento está produciendo exactamente lo que habíamos pedido (gran sorpresa). Lo que busco es una forma de convertir los encabezados y los elementos de nivel superior al nivel sub-menú. He vuelto hacia este control plantilla de ejemplo en MSDN de una solución (abajo).

Editar, Editar: @gcores (comentario de discusión): ¿En serio? Me estoy perdiendo algo?

<ToolBar Name="toolBar1" Band="1" BandIndex="4"> 
    <!-- Displayed Buttons -->
    <Button>A</Button>
    <Button>B</Button>
    <!-- Special Items Menu -->
    <Menu ToolBar.OverflowMode="Always" >
        <MenuItem Style="{StaticResource MenuItemStyle}" Header="Special">
            <MenuItem Header="C"/>
            <MenuItem Header="D"/>
        </MenuItem>
    </Menu>
</ToolBar>

Este fragmento no funciona para mí. Tengo que hacer clic en 'especial' para el sub-menú para mostrar.

¿Fue útil?

Solución

La única manera de que pudiera encontrar a siquiera se acercan a la generación de este comportamiento era crear un menú en el desbordamiento que contenía un elemento de menú único cuya cabecera era en sí misma otro elemento del menú llamado "artículos especiales" y que contiene los niños apropiados. Funcionó como se esperaba, pero parecía extraño (esto podría remediarse mediante plantillas personalizadas) y también parece como un gran truco. La única forma "correcta" de hacer esto que se me ocurre sería hacer su propio control MenuItem similar a lo que abrirá una ContextMenu o emergente cuando flotaba sobre, ya que no creo que un ControlTemplate personalizado puede cambiar el comportamiento predeterminado de un menú para que no se requiere un clic en el elemento del nivel superior.

Otros consejos

Otra solución es el uso de las plantillas existentes y anular la plantilla para el TopLevelHeader con la Plantilla de la SubmenuHeader.

<Style x:Key="MenuItemStyle" TargetType="{x:Type MenuItem}">
  <Style.Triggers>
    <Trigger Property="Role" Value="TopLevelHeader">
      <Setter Property="Template"
              Value="{StaticResource {x:Static MenuItem.SubmenuHeaderTemplateKey}}"/>
    </Trigger>
  </Style.Triggers> 
</Style>

Y el uso de este estilo en su nivel superior Menultem. Eso debería simplificar el código.

Editar : Tienes razón, sólo funciona cuando se hace clic en él (no sé cómo me convencí de que funcionaba, lo siento :)). Es funcionalidad es como un TopLevelMenu a pesar de que la plantilla diga lo contrario, es bastante confusa.

Lo único que se me ocurre es la adición de un disparador para mostrar el submenú de IsMenuOver y gastos del evento Click por lo que no hace nada, pero no sé qué tan bien que iba a funcionar.

Después de más de lectura, una solución que estoy usando es abajo.

<!-- Resource Dictionary Stuff -->

<!-- Some Brushes -->
<SolidColorBrush x:Key="Brush_1"
    Color="White" />

<LinearGradientBrush x:Key="Brush_2"
    StartPoint="0 0"
    EndPoint="0 1">

    <GradientStop
        Color="White"
        Offset="0"/>

    <GradientStop 
        Color="DarkSeaGreen"
        Offset="1"/>

</LinearGradientBrush>

<SolidColorBrush x:Key="Brush_3"
    Color="DarkOliveGreen"/>

<!-- Custom MenuItem - Top Level Header - Style 1 -->
<Style x:Key="MenuItem_TLH_Style1"
    TargetType="MenuItem">

    <!--<EventSetter Event="PreviewMouseDown" Handler="DoNothing"/>-->

    <Setter Property="Template">
        <Setter.Value>

            <ControlTemplate x:Name="ControlTemplate"
                TargetType="MenuItem">

                <!-- A headered text that may display a submenu
                     on a trigger. This submenu is the host for a
                     menu item's items. -->
                <Border x:Name="BoundaryBorder"
                    Background="{StaticResource Brush_1}"
                    BorderThickness="1">

                    <Grid x:Name="ContainerGrid">

                        <ContentPresenter x:Name="HeaderContent"
                            Margin="6 3 6 3" 
                            ContentSource="Header"
                            RecognizesAccessKey="True"/>

                        <Popup x:Name="SubmenuPopup"
                            Placement="Bottom"
                            IsOpen="{TemplateBinding IsSubmenuOpen}"
                            AllowsTransparency="True"
                            Focusable="False"
                            PopupAnimation="Fade">

                            <Border x:Name="SubmenuBoundaryBorder"
                                SnapsToDevicePixels="True"
                                Background="{StaticResource Brush_1}"
                                BorderBrush="{StaticResource SolidBorderBrush}"
                                BorderThickness="1">

                                <StackPanel x:Name="ItemsStackPanel"
                                    IsItemsHost="True"
                                    KeyboardNavigation.DirectionalNavigation="Cycle"/>

                            </Border>
                        </Popup>
                    </Grid>
                </Border>

                <ControlTemplate.Triggers>

                    <!--  -->
                    <Trigger
                        Property="IsSuspendingPopupAnimation"
                        Value="true">

                        <Setter 
                            TargetName="SubmenuPopup"
                            Property="PopupAnimation"
                            Value="Fade"/>

                    </Trigger>

                    <!-- On mouse-over, show the submenu and highlight the header. -->
                    <Trigger 
                        Property="IsMouseOver"
                        Value="true">

                        <Setter 
                            TargetName="BoundaryBorder"
                            Property="Background"
                            Value="{StaticResource Brush_2}"/>

                        <Setter 
                            TargetName="BoundaryBorder"
                            Property="BorderBrush"
                            Value="{StaticResource Brush_3}"/>

                        <Setter
                            Property="IsSubmenuOpen"
                            Value="true"/>

                        <!-- sloppy? -->
                        <Setter
                            TargetName="SubmenuPopup"
                            Property="IsOpen"
                            Value="true"/>

                    </Trigger>

                    <Trigger 
                        SourceName="SubmenuPopup"
                        Property="AllowsTransparency"
                        Value="true">

                        <Setter 
                            TargetName="SubmenuBoundaryBorder"
                            Property="CornerRadius"
                            Value="0 0 4 4"/>

                        <Setter 
                            TargetName="SubmenuBoundaryBorder"
                            Property="Padding"
                            Value="0 0 0 3"/>

                    </Trigger>

                    <!-- Visually indicate an unaccessible menu item. -->
                    <Trigger
                        Property="IsEnabled"
                        Value="false">

                        <Setter 
                            Property="Foreground"
                            Value="{StaticResource DisabledForegroundBrush}"/>

                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<!-- ... -->

<!-- Inside a window XAML file -->

<!-- Tool Bar Tray -->
<ToolBarTray x:Name="toolBarTray1"
    DockPanel.Dock="Top">

    <!-- File And Edit Tools -->
    <ToolBar x:Name="toolBar1" 
        Band="1" BandIndex="1">

        <!-- Displayed Buttons -->
        <Button x:Name="ButtonA"
            Content="A"/>

        <Button x:Name="ButtonB"
            Content="B"/>

        <!-- Overflow Menu For Special Items -->
        <Menu x:Name="OverflowMenu"
            ToolBar.OverflowMode="Always">

            <MenuItem x:Name="SpecialsMenuItem" 
                Style="{StaticResource MyStyle}"
                Header="Special Items">

                <MenuItem x:Name="CMenuItem"
                    Header="C">

                    <MenuItem x:Name="DMenuItem"
                        Header="D"/>

                </MenuItem>
            </MenuItem>
        </Menu>
    </ToolBar>
</ToolBarTray>

ataco el comportamiento de 'SubmenuPopup' en un ratón por encima, en lugar de controlar el evento clic. Me gustaría entender esto más a fondo, así que traté de comentar a cabo esta parte del gatillo y la adición de un controlador de eventos que llama a un método 'DoNothing ()' en caso de que el 'PreviewMouseDown'. Resulta que me estoy perdiendo algo y creo que está relacionado con el enfoque y / o cómo un menú maneja su colección artículos. No permitir que un evento se propague después de 'DoNothing ()' (routedEventArgs.Handled = true) parece eliminar los problemas al hacer clic en la opción de menú "artículos especiales". Sin embargo, si uno navegado lejos del menú o se añade otro elemento de menú y luego hace clic en eso, el comportamiento estacionario se puede apagar o encender y apagar.

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