none
como cambiar style del context menu RRS feed

  • Pregunta

  • Buen dia!

    He hecho en c# un context menu que se invoca al dar click al boton derecho del mouse, tiene 3 opciones para dar formato a una imagen y la primera opcion tiene 2 submenus, asi:

    private void CreaMenuContextual()
                    {
                        _SubMenuVisor = new ContextMenu();
                        _SubMenuVisor.Name = "SubMenuVisor";

                        MenuItem nuevaOpcion = new MenuItem();

                        _SubMenuVisor.Style = (Style)Estilo["EstiloContextMenu"];
                        //Imagen Original
                        nuevaOpcion.Name = "Original";
                        nuevaOpcion.Style = (Style)Estilo["EstiloMenuItem"];
                        _SubMenuVisor.Items.Add(nuevaOpcion);

                            MenuItem subMenu = new MenuItem();
                            subMenu.Name = "OriginalMiniatura";
                            subMenu.Style = (Style)Estilo["EstiloSubMenuItem"];
                            nuevaOpcion.Items.Add(subMenu);

                            subMenu = new MenuItem();
                            subMenu.Name = "OriginalMaximo";
                            subMenu.Style = (Style)Estilo["EstiloSubMenuItem2"];
                            nuevaOpcion.Items.Add(subMenu);
                       
                        nuevaOpcion = new MenuItem();
                        nuevaOpcion.Name = "Exportar";
                        nuevaOpcion.Style = (Style)Estilo["EstiloMenuItem"];
                        _SubMenuVisor.Items.Add(nuevaOpcion);

                        nuevaOpcion = new MenuItem();
                        nuevaOpcion.Name = "Impresion";
                        nuevaOpcion.Style = (Style)Estilo["EstiloMenuItem"];
                        _SubMenuVisor.Items.Add(nuevaOpcion);           
                    }
    El background de este menu contextual tiene un degradado bastante padre definido en un estilo que se llama "EstiloContextMenu" guardado en un diccionario de recursos del cual se toma, el estilo esta definido asi:

    <Style x:Key="EstiloContextMenu" TargetType="{x:Type ContextMenu}">
        <Setter Property="BorderBrush" Value="Black"/>
        <Setter Property="Background">
            <Setter.Value>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" SpreadMethod="Reflect">
                    <GradientStop Color="#FF000000" Offset="0"/>
                    <GradientStop Color="#FF536785" Offset="0.991"/>
                    <GradientStop Color="#FF384656" Offset="0.702"/>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
    </Style>

    Quiero usar ese mismo background para el submenu del primer Item pero no se como, solo puedo usar el backgroud por cada uno de los subItems y no puedo ponerle ese mismo background a todos el conjunto de los subItems de la primera opcion porque en lo que seria el menu principal (context menu) ahi si se puede.

    Alguna sugerencia??????

    He intentado aplicarle al submenu popUp un estilo pero a la hora de ponerlo en ejecucion no me muestra nada, el codigo del estilo es algo parecido a esto:

    <Style x:Key="EstiloContextMenu" TargetType="{x:Type ContextMenu}">
        <Setter Property="BorderBrush" Value="Black"/>
        <Setter Property="Background">
            <Setter.Value>
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" SpreadMethod="Reflect">
                    <GradientStop Color="#FF000000" Offset="0"/>
                    <GradientStop Color="#FF536785" Offset="0.991"/>
                    <GradientStop Color="#FF384656" Offset="0.702"/>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ContextMenu}">
                    <Popup IsOpen="{Binding IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}" Placement="Right" x:Name="SubMenuPopup" Focusable="false"
                               AllowsTransparency="true" PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}" VerticalOffset="-3">
                        <Grid x:Name="SubMenu">
                            <Border x:Name="SubMenuBorder" Background="Transparent" BorderBrush="Transparent" BorderThickness="1"/>
                            <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle" Style="{DynamicResource EstiloStackPanel}" />
                        </Grid>
                    </Popup>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    martes, 20 de julio de 2010 17:17

Respuestas

  • ¡Hola!

    Ya que veo que nadie se anima a reponderte, por lo que voy a ver si te puedo ayudar. Si he entendido bien, porque me he hecho un lio con tanto código.

    Voy a empezar trabajando un poco los conceptos (Te aconsejo el Blog de Yeray para aprender el manejo de los estilos):

    Si declaras un <Style x:Key="EstiloContextMenu" TargetType="{x:Type ContextMenu}">
    y te fijas, estas declarando un estilo para un contextmenu, no para sus elementos (items).

    Lo que debes de hacer, en mi humilde opinión, es declarar un estilo para el item (si sólo quieres que el primer elemento tenga un estilo particular, tendrías que declarar dos).

    Una vez hecho esto, en la creación del ContextMenu, asigna el estilo particular al primero de los elementos y el otro estilo al resto. Como haces aqui: subMenu.Style = (Style)Estilo["EstiloSubMenuItem2"];

    En resumen, cuando declares estilos fijate en su tipo para luego poderselo asignar al control adecuado. Creo que este es tu principal problema.

    Espero que te haya ayudado. Un saludo,

     

    lunes, 26 de julio de 2010 22:15