Как совместить все шаблоны в 1 стиль

94
19 мая 2021, 05:50

Есть код переопределяющий дизайн элемента Menu.

<!--Основной стиль меню-->
<Style x:Key="MenuTemplate" TargetType="{x:Type Menu}">
    <Setter Property="OverridesDefaultStyle" Value="True"/>
    <Setter Property="SnapsToDevicePixels" Value="True"/>
    <Setter Property="FontSize" Value="13"/>
    <Setter Property="Height" Value="30"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Menu}">
                <Border BorderThickness="1" BorderBrush="#57A0FF" Background="#525457">
                    <StackPanel ClipToBounds="True" Orientation="Horizontal" IsItemsHost="True"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<!--Шаблон для элемента в главном меню с подэлементами-->
<ControlTemplate x:Key="TopLevelHeaderTemplate" TargetType="{x:Type MenuItem}">
    <Border x:Name="Border">
        <Grid>
            <ContentPresenter Margin="6,3,6,3" ContentSource="Header" RecognizesAccessKey="True" VerticalAlignment="Center"/>
            <Popup x:Name="Popup" Placement="Bottom" IsOpen="{TemplateBinding IsSubmenuOpen}"
                   AllowsTransparency="True" Focusable="False" PopupAnimation="Fade">
                <Border x:Name="SubmenuBorder" SnapsToDevicePixels="True" BorderThickness="1" Background="#252626"
                        BorderBrush="Black">
                    <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle"/>
                </Border>
            </Popup>
        </Grid>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsSuspendingPopupAnimation" Value="True">
            <Setter TargetName="Popup" Property="PopupAnimation" Value="None"/>
        </Trigger>
        <Trigger Property="IsHighlighted" Value="True">
            <Setter Property="Background" TargetName="Border" Value="#242424"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
<!--Шаблон для элемента в главном меню без подэлементов-->
<ControlTemplate x:Key="TopLevelItemTemplate" TargetType="{x:Type MenuItem}">
    <Border x:Name="Border">
        <ContentPresenter Margin="6,3,6,3" ContentSource="Header" RecognizesAccessKey="True" VerticalAlignment="Center"/>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsHighlighted" Value="True">
            <Setter Property="Background" TargetName="Border" Value="#242424"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
<!--Шаблон для подэлемента меню без подэлементов-->
<ControlTemplate x:Key="SubmenuItemTemplate" TargetType="{x:Type MenuItem}">
    <Border x:Name="Border">
        <Grid VerticalAlignment="Center" Margin="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto" SharedSizeGroup="Shortcut"/>
            </Grid.ColumnDefinitions>
            <ContentPresenter Margin="5,0,15,0" x:Name="HeaderHost" Grid.Column="0" ContentSource="Header" RecognizesAccessKey="True"/>
            <TextBlock x:Name="InputGestureText" Grid.Column="1" Text="{TemplateBinding InputGestureText}" DockPanel.Dock="Right" Margin="0,0,5,0"/>
        </Grid>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsHighlighted" Value="True">
            <Setter TargetName="Border" Property="Background" Value="#333333"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
<!--Шаблон для подэлемента меню с подэлементами-->
<ControlTemplate x:Key="SubmenuHeaderTemplate" TargetType="{x:Type MenuItem}">
    <Border x:Name="Border">
        <Grid VerticalAlignment="Center" Margin="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="13"/>
            </Grid.ColumnDefinitions>
            <ContentPresenter x:Name="HeaderHost" Grid.Column="0" ContentSource="Header" RecognizesAccessKey="True" Margin="5,0,0,0"/>
            <Path Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,5,0"
                  Data="M 0 0 L 0 7 L 4 3.5 Z" Fill="{TemplateBinding Foreground}"/>
            <Popup x:Name="Popup" Placement="Right" IsOpen="{TemplateBinding IsSubmenuOpen}" HorizontalOffset="10" VerticalOffset="-3"
                   AllowsTransparency="True" Focusable="False" PopupAnimation="Fade">
                <Border x:Name="SubmenuBorder" SnapsToDevicePixels="True" BorderThickness="1" Background="#252626" BorderBrush="Black">
                    <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle" />
                </Border>
            </Popup>
        </Grid>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsHighlighted" Value="True">
            <Setter TargetName="Border" Property="Background" Value="#333333"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

И есть еще 1 стиль который распределяет шаблоны по нужным элементам меню.

<!--Стиль который распределяет шаблоны соответсвутющим элементам-->
<Style x:Key="{x:Type MenuItem}" TargetType="{x:Type MenuItem}">
    <Setter Property="OverridesDefaultStyle" Value="True"/>
    <Style.Triggers>
        <Trigger Property="Role" Value="TopLevelHeader">
            <Setter Property="Template" Value="{StaticResource TopLevelHeaderTemplate}" />
            <Setter Property="Grid.IsSharedSizeScope" Value="true" />
            <Setter Property="Foreground" Value="#E6E6E6"/>
        </Trigger>
        <Trigger Property="Role"  Value="TopLevelItem">
            <Setter Property="Template" Value="{StaticResource TopLevelItemTemplate}" />
            <Setter Property="Foreground" Value="#E6E6E6"/>
        </Trigger>
        <Trigger Property="Role" Value="SubmenuHeader">
            <Setter Property="Template" Value="{StaticResource SubmenuHeaderTemplate}" />
        </Trigger>
        <Trigger Property="Role" Value="SubmenuItem">
            <Setter Property="Template" Value="{StaticResource SubmenuItemTemplate}" />
        </Trigger>
    </Style.Triggers>
</Style>

Но проблема в том что x:Key="{x:Type MenuItem}" то есть шаблоны применяется ко всем MenuItem а я бы хотел чтобы шаблоны применялись лишь для 1 меню у которого Style="{StaticResource MenuTemplate}".

Пытался занести этот стиль в ItemContainerStyle но почему то Setter`ы работали кроме тех которые присваивают шаблоны элементам. Да и еще шаблоны применялись только к главным элементам, а к их SubMenu присваивались стандартные значения.

P.s извиняюсь за глупый вопрос

Answer 1

Все оказалось куда проще

<Style.Resources>
        <!--Стиль который распределяет шаблоны соответсвутющим элементам-->
        <Style TargetType="{x:Type MenuItem}">
            <Setter Property="OverridesDefaultStyle" Value="True"/>
            <Style.Triggers>
                <Trigger Property="Role" Value="TopLevelHeader">
                    <Setter Property="Template" Value="{DynamicResource TopLevelHeaderTemplate}" />
                    <Setter Property="Grid.IsSharedSizeScope" Value="true" />
                    <Setter Property="Foreground" Value="#E6E6E6"/>
                </Trigger>
                <Trigger Property="Role"  Value="TopLevelItem">
                    <Setter Property="Template" Value="{DynamicResource TopLevelItemTemplate}" />
                    <Setter Property="Foreground" Value="#E6E6E6"/>
                </Trigger>
                <Trigger Property="Role" Value="SubmenuHeader">
                    <Setter Property="Template" Value="{DynamicResource SubmenuHeaderTemplate}" />
                </Trigger>
                <Trigger Property="Role" Value="SubmenuItem">
                    <Setter Property="Template" Value="{DynamicResource SubmenuItemTemplate}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Style.Resources>
READ ALSO
Кеширует ли .NET коллекцию?

Кеширует ли .NET коллекцию?

Например, есть метод, который на вход принимает массив значений

91
Не понимаю как работает такой массив

Не понимаю как работает такой массив

Что я должен написать в ShopCost[index] и в ShopBonus[index]? Как нужно обявить масивы ShopCost[index] и ShopBonus[index]Ну я имею виду я обявляю масивы так

98
При возвращении IEnumerable из контроллера не перехватывается Exception

При возвращении IEnumerable из контроллера не перехватывается Exception

Есть метод в контроллере который возвращает IEnumerable, в процессе конвейера LINQ происходит Exception и фильтр эксепшенов не перехватывает этот эксепшен...

131
Как заполнить поля на сайте для POST запроса

Как заполнить поля на сайте для POST запроса

На сайте есть два поля-календаря, которыми задается интервал дат, за который необходимо получить информацию из БДНикак не могу понять, каким...

77