Стилизация вложенных элементов в WPF - PullRequest
58 голосов
/ 20 марта 2009

Предположим, у вас есть структура вложенных элементов, например ContextMenu с MenuItems:

<ContextMenu Style="{StaticResource FooMenuStyle}">
    <MenuItem Style="{StaticResource FooMenuItemStyle}"/>
    ...
</ContextMenu>

Вы можете легко применять стили или шаблоны к элементам ContextMenu или MenuItem. Но если стиль MenuItem относится к стилю Menu, его довольно громоздко и избыточно добавлять в каждый элемент MenuItem.

Есть ли способ применить их автоматически к дочерним элементам? Так что вы можете просто написать это:

<ContextMenu Style="{StaticResource FooMenuStyle}">
    <MenuItem/>
    ...
</ContextMenu>

Было бы замечательно, если бы FooMenuStyle мог стилизовать элементы MenuItem, но это не представляется возможным.

Edit: пример меню, вероятно, вводит в заблуждение, так как я не знал о ItemContainerStyle, и намерение было для общего решения. Основываясь на двух ответах, я придумал два решения: один общий вариант и один для ItemContainerStyle и тому подобное:

<Style x:Key="FooMenuItem" TargetType="{x:Type MenuItem}">
    ...
</Style>

<Style x:Key="FooMenu" TargetType="{x:Type ContextMenu}">
    <!-- Variant for specific style attribute -->
    <Setter Property="ItemContainerStyle"
            Value="{StaticResource FooMenuItem}"/>

    <!-- General variant -->
    <Style.Resources>
        <Style TargetType="{x:Type MenuItem}"
               BasedOn="{StaticResource FooMenuItem}"/>
    </Style.Resources>
</Style>

<ContextMenu Style="{StaticResource FooMenu}">
    <MenuItem/>
</ContextMenu>

Ответы [ 3 ]

132 голосов
/ 02 ноября 2010

Просто, чтобы завершить первоначальный ответ, я думаю, что было бы яснее добавить вложенный стиль внутри родительского элемента так:

<Style x:Key="WindowHeader" TargetType="DockPanel" >
    <Setter Property="Background" Value="AntiqueWhite"></Setter>
    <Style.Resources>
        <Style TargetType="Image">
            <Setter Property="Margin" Value="6"></Setter>
            <Setter Property="Width" Value="36"></Setter>
            <Setter Property="Height" Value="36"></Setter>
        </Style>
        <Style TargetType="TextBlock">
            <Setter Property="TextWrapping" Value="Wrap"></Setter>
        </Style>
    </Style.Resources>
</Style>
22 голосов
/ 20 марта 2009
<ContextMenu>
   <ContextMenu.Resources>
      <Style TargetType="{x:Type MenuItem}">
         <!--Setters-->
      </Style>
   </ContextMenu.Resources>
   <MenuItem/>
   <!--Other MenuItems-->
</ContextMenu>

Стиль будет применяться ко всем объектам MenuItem в ContextMenu.

6 голосов
/ 20 марта 2009
<ContextMenu ItemContainerStyle="{StaticResource FooMenuItemStyle}">
    <MenuItem/>
</ContextMenu>
...