Button ContextMenu Styling in wpf

201
21 мая 2021, 08:50

Я пытаюсь присвоить стиль для ContextMenu, чтоб было похоже на интерфейс Дискорда

Вообще, меня удивляет белая зона на меню итеме почему она не воспринимает Background Setter?

Можете прислать примеры стилей для ContextMenu?

Вот, что я попробовал сделать

вот, что получилось на курсор не реагирует, хотя IsMouseOver определён можно как-то место под icon убрать?

не помогло даже это

Может кто знает, как получить копию дефолтного стиля, как это делаться с кнопкой нажатием пкм на нее в визуальном редакторе, тогда прака шаблона->правка копии (ведь контекстное меню отсутствует в визуальном редакторе)

<Style x:Key="MenuItemStyle" TargetType="{x:Type MenuItem}">
               <Setter Property="Background" Value="{StaticResource MidBrsh}"></Setter>
               <Setter Property="Cursor" Value="Hand"></Setter>
               <Style.Triggers>
                   <Trigger Property="MenuItem.IsMouseOver" Value="true">
                       <Setter Property="Background" Value="{StaticResource MidBrsh}"></Setter>
                   </Trigger>
               </Style.Triggers>
           </Style>
           <Style x:Key="ContextMenuStyle" TargetType="{x:Type ContextMenu}">
               <Setter Property="Background" Value="{StaticResource MidBrsh}"/>
               <!--<Setter Property="" Value="{StaticResource MidBrsh}"/>-->
               <Setter Property="BorderThickness" Value="0"/>
               <Setter Property="BorderBrush" Value="{StaticResource MidBrsh}"/>
           </Style>
           <Style x:Key="ContextMenuButtonStyle" TargetType="Button">
               <Setter Property="Background" Value="Transparent"></Setter>
               <Setter Property="Cursor" Value="Hand"></Setter>
               <Setter Property="ContextMenu">
                   <Setter.Value>
                       <ContextMenu Style="{StaticResource ContextMenuStyle}">
                           <MenuItem Header="SAS" Style="{StaticResource MenuItemStyle}">
                               <!--<Button Content="AAA"></Button>-->
                           </MenuItem>
                           <MenuItem Header="SAS2" Style="{StaticResource MenuItemStyle}"></MenuItem>
                       </ContextMenu>
                   </Setter.Value>
               </Setter>

Вопрос к ответу D .Stark: вот код:

<!-- ContextMenu separator style -->
           <Style x:Key="MenuSeparatorStyle" TargetType="{x:Type Separator}">
               <Setter Property="SnapsToDevicePixels" Value="True"/>
               <Setter Property="OverridesDefaultStyle" Value="True"/>
               <Setter Property="IsTabStop" Value="False"/>
               <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/>
               <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
               <Setter Property="Background" Value="#323232"/>
               <Setter Property="Height" Value="5"/>
               <Setter Property="Template">
                   <Setter.Value>
                       <ControlTemplate TargetType="{x:Type Separator}">
                           <Border Height="5" Margin="-2,2" VerticalAlignment="Center" Background="#FF464646"/>
                       </ControlTemplate>
                   </Setter.Value>
               </Setter>
           </Style>
           <!-- MenuItem style -->
           <Style TargetType="{x:Type MenuItem}">
               <Setter Property="SnapsToDevicePixels" Value="True"/>
               <Setter Property="OverridesDefaultStyle" Value="True"/>
               <Setter Property="Foreground" Value="#BEBEBE"/>
               <Setter Property="Template">
                   <Setter.Value>
                       <ControlTemplate TargetType="{x:Type MenuItem}">
                           <Grid Name="Root" Height="27" Background="{StaticResource MidBrsh}">
                               <ContentPresenter Name="HeaderHost" Margin="10,0,0,0" ContentSource="Header" RecognizesAccessKey="True" HorizontalAlignment="Left" VerticalAlignment="Center"
                     TextOptions.TextRenderingMode="ClearType" TextBlock.FontSize="12" TextBlock.Foreground="{TemplateBinding Foreground}" TextOptions.TextFormattingMode="Display"/>
                           </Grid>
                           <ControlTemplate.Triggers>
                               <Trigger Property="IsMouseOver" Value="True">
                                   <Setter TargetName="Root" Property="Background" Value="#505050"/>
                               </Trigger>
                               <Trigger Property="IsPressed" Value="True">
                                   <Setter TargetName="Root" Property="Background" Value="#808080"/>
                               </Trigger>
                           </ControlTemplate.Triggers>
                       </ControlTemplate>
                   </Setter.Value>
               </Setter>
           </Style>
           <!-- ContextMenu style -->
           <Style x:Key="ContextMenuStyle" TargetType="{x:Type ContextMenu}">
               <Setter Property="SnapsToDevicePixels" Value="True"/>
               <Setter Property="OverridesDefaultStyle" Value="True"/>
               <Setter Property="Cursor" Value="Hand"/>
               <Setter Property="Width" Value="170"/>
               <Setter Property="Template">
                   <Setter.Value>
                       <ControlTemplate TargetType="{x:Type ContextMenu}">
                           <Grid Background="Transparent">
                               <Border Margin="0,0,5,5" Background="{StaticResource MidBrsh}" BorderThickness="0">
                                   <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle" Margin="2"/>
                                   <Border.Effect>
                                       <DropShadowEffect BlurRadius="3" ShadowDepth="3" Color="Black" Opacity="0.5"/>
                                   </Border.Effect>
                               </Border>
                           </Grid>
                       </ControlTemplate>
                   </Setter.Value>
               </Setter>
           </Style>
           <Style x:Key="ContextMenuButtonStyle" TargetType="Button">
               <Setter Property="Background" Value="Transparent"></Setter>
               <Setter Property="Cursor" Value="Hand"></Setter>
               <Setter Property="ContextMenu">
                   <Setter.Value>
                       <ContextMenu Style="{StaticResource ContextMenuStyle}">
                           <Grid Background="White">
                               <Grid.ContextMenu>
                                   <ContextMenu FontFamily="Calibri">
                                       <MenuItem Header="Скрыть имена"/>
                                       <MenuItem Header="Настроить канал"/>
                                       <Separator Style="{StaticResource MenuSeparatorStyle}"/>
                                       <MenuItem Header="Экспресс-приглашение"/>
                                       <MenuItem Header="Клонировать канал"/>
                                       <MenuItem Header="Создать голосовой канал"/>
                                       <Separator Style="{StaticResource MenuSeparatorStyle}"/>
                                       <MenuItem Header="Удалить канал" Foreground="#FFC83232"/>
                                   </ContextMenu>
                               </Grid.ContextMenu>
                           </Grid>
                       </ContextMenu>
                   </Setter.Value>
               </Setter>

но вот, что я получил:

А вот так:

 <Style x:Key="ContextMenuButtonStyle" TargetType="Button">
               <Setter Property="Background" Value="Transparent"></Setter>
               <Setter Property="Cursor" Value="Hand"></Setter>
               <Setter Property="ContextMenu">
                   <Setter.Value>
                       <ContextMenu FontFamily="Calibri">
                           <MenuItem Header="Скрыть имена"/>
                           <MenuItem Header="Настроить канал"/>
                           <Separator Style="{StaticResource MenuSeparatorStyle}"/>
                           <MenuItem Header="Экспресс-приглашение"/>
                           <MenuItem Header="Клонировать канал"/>
                           <MenuItem Header="Создать голосовой канал"/>
                           <Separator Style="{StaticResource MenuSeparatorStyle}"/>
                           <MenuItem Header="Удалить канал" Foreground="#FFC83232"/>
                       </ContextMenu>
                   </Setter.Value>
               </Setter>

получил вот такое:

и вот ещё пробую:

<Setter Property="ContextMenu">
                    <Setter.Value>
                        <ContextMenu FontFamily="Calibri" BorderBrush="{StaticResource MidBrsh}">
                            <MenuItem Header="Скрыть имена" Style="{StaticResource MenuItemStyle}"/>
                            <MenuItem Header="Настроить канал" Style="{StaticResource MenuItemStyle}"/>
                            <Separator Style="{StaticResource MenuSeparatorStyle}"/>
                            <MenuItem Header="Экспресс-приглашение" Style="{StaticResource MenuItemStyle}"/>
                            <MenuItem Header="Клонировать канал" Style="{StaticResource MenuItemStyle}"/>
                            <MenuItem Header="Создать голосовой канал" Style="{StaticResource MenuItemStyle}"/>
                            <Separator Style="{StaticResource MenuSeparatorStyle}" />
                            <MenuItem Header="Удалить канал" Foreground="#FFC83232" Style="{StaticResource MenuItemStyle}"/>
                        </ContextMenu>
                    </Setter.Value>
                </Setter>

и вот такое:

что делать с краями?

Answer 1

Стили:

<SolidColorBrush x:Key="MidBrsh" Color="#202020"/>
<!-- ContextMenu separator style -->
<Style x:Key="MenuSeparatorStyle" TargetType="{x:Type Separator}">
    <Setter Property="SnapsToDevicePixels" Value="True"/>
    <Setter Property="OverridesDefaultStyle" Value="True"/>
    <Setter Property="IsTabStop" Value="False"/>
    <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/>
    <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
    <Setter Property="Background" Value="#323232"/>
    <Setter Property="Height" Value="5"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Separator}">
                <Border Height="5" Margin="-2,2" VerticalAlignment="Center" Background="#FF464646"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<!-- MenuItem style -->
<Style TargetType="{x:Type MenuItem}">
    <Setter Property="SnapsToDevicePixels" Value="True"/>
    <Setter Property="OverridesDefaultStyle" Value="True"/>
    <Setter Property="Foreground" Value="#BEBEBE"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type MenuItem}">
                <Grid Name="Root" Height="27" Background="{StaticResource MidBrsh}">
                    <ContentPresenter Name="HeaderHost" Margin="10,0,0,0" ContentSource="Header" RecognizesAccessKey="True" HorizontalAlignment="Left" VerticalAlignment="Center"
                      TextOptions.TextRenderingMode="ClearType" TextBlock.FontSize="12" TextBlock.Foreground="{TemplateBinding Foreground}" TextOptions.TextFormattingMode="Display"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="Root" Property="Background" Value="#505050"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="Root" Property="Background" Value="#808080"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<!-- ContextMenu style -->
<Style TargetType="{x:Type ContextMenu}">
    <Setter Property="SnapsToDevicePixels" Value="True"/>
    <Setter Property="OverridesDefaultStyle" Value="True"/>
    <Setter Property="Cursor" Value="Hand"/>
    <Setter Property="Width" Value="170"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ContextMenu}">
                <Grid Background="Transparent">
                    <Border Margin="0,0,5,5" Background="{StaticResource MidBrsh}" BorderThickness="0">
                        <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle" Margin="2"/>
                        <Border.Effect>
                            <DropShadowEffect BlurRadius="3" ShadowDepth="3" Color="Black" Opacity="0.5"/>
                        </Border.Effect>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Используем.

<Grid Background="White">
    <Grid.ContextMenu>
        <ContextMenu FontFamily="Calibri">
            <MenuItem Header="Скрыть имена"/>
            <MenuItem Header="Настроить канал"/>
            <Separator Style="{StaticResource MenuSeparatorStyle}"/>
            <MenuItem Header="Экспресс-приглашение"/>
            <MenuItem Header="Клонировать канал"/>
            <MenuItem Header="Создать голосовой канал"/>
            <Separator Style="{StaticResource MenuSeparatorStyle}"/>
            <MenuItem Header="Удалить канал" Foreground="#FFC83232"/>
        </ContextMenu>
    </Grid.ContextMenu>
</Grid>

В принципе, похоже:

Answer 2

Вот пример использования того, что показал D .Stark, спасибо ему

<Setter Property="ContextMenu">
                    <Setter.Value>
                        <ContextMenu FontFamily="Calibri" BorderBrush="{StaticResource MidBrsh}" Style="{StaticResource ContextMenuStyle}">
                            <MenuItem Header="Скрыть имена" Style="{StaticResource MenuItemStyle}"/>
                            <MenuItem Header="Настроить канал" Style="{StaticResource MenuItemStyle}"/>
                            <Separator Style="{StaticResource MenuSeparatorStyle}"/>
                            <MenuItem Header="Экспресс-приглашение" Style="{StaticResource MenuItemStyle}"/>
                            <MenuItem Header="Клонировать канал" Style="{StaticResource MenuItemStyle}"/>
                            <MenuItem Header="Создать голосовой канал" Style="{StaticResource MenuItemStyle}"/>
                            <Separator Style="{StaticResource MenuSeparatorStyle}" />
                            <MenuItem Header="Удалить канал" Foreground="#FFC83232" Style="{StaticResource MenuItemStyle}"/>
                        </ContextMenu>
                    </Setter.Value>
                </Setter>
READ ALSO
Не получается запретить доступ не авторизованным пользователям на страницу

Не получается запретить доступ не авторизованным пользователям на страницу

хочу запретить доступ не авторизованным пользователям на страницу indexphp и если пользователь пишет в адресной строке /index

113
Помогите сформировать массив на php

Помогите сформировать массив на php

Друзья, помогите сформировать массив

103
Как очистить форму при неправильном заполнении?

Как очистить форму при неправильном заполнении?

У меня есть форма заполненияВ первой форме клиент пишет номер счет-фактуры, если оно есть в базе то на второй форме появляется сумма которую...

117
Требуется вывод введенных данных с contact form 7

Требуется вывод введенных данных с contact form 7

Появилась задача валидации веденных данных клиентомТо есть клиент вводит свои данные в контактной форме ( Contact form 7 ) , его перенаправляет...

181