67

MenuItems を持つ ContextMenu など、ネストされた要素構造があるとします。

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

スタイルやテンプレートを ContextMenu または MenuItem 要素に簡単に適用できます。ただし、MenuItem スタイルが Menu スタイルに属している場合、それをすべての MenuItem 要素に追加するのは非常に面倒で冗長です。

それらを子要素に自動的に適用する方法はありますか? これを簡単に書くことができるように:

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

FooMenuStyle が MenuItem 要素を含むスタイルを設定できると便利ですが、それは不可能のようです。

編集:私は ItemContainerStyle を認識しておらず、その意図は一般的な解決策であったため、メニューの例はおそらく誤解を招く可能性があります。2 つの回答に基づいて、2 つの解決策を考え出しました。1 つは一般的なバリアントで、もう 1 つは 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>
4

4 に答える 4

170

元の答えを完成させるために、次のように親の中にネストされたスタイルを追加する方が明確だと思います。

<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>
于 2010-11-02T13:45:14.657 に答える
30
<ContextMenu>
   <ContextMenu.Resources>
      <Style TargetType="{x:Type MenuItem}">
         <!--Setters-->
      </Style>
   </ContextMenu.Resources>
   <MenuItem/>
   <!--Other MenuItems-->
</ContextMenu>

スタイルは、ContextMenu 内のすべての MenuItem オブジェクトに適用されます。

于 2009-03-20T14:07:14.573 に答える
5
<ContextMenu ItemContainerStyle="{StaticResource FooMenuItemStyle}">
    <MenuItem/>
</ContextMenu>
于 2009-03-20T14:27:18.893 に答える