[XAML] スタイルの継承

2013年10月10日

 Application.Resources などの親側の Resource で x:key なしの TargetType 指定したスタイルを、Window.Resources などの子側で継承したい場合のやり方。

 その TargetType の型をそのまま継承すればよいようです。

<Window.Resources>
  <Style TargetType="DataGrid" BasedOn="{StaticResource {x:Type DataGrid}}">
    <Setter Property="IsReadOnly" Value="True"/>
  </Style>
</Window.Resources>

 

 たとえば、以下のような xaml を記述します。

<Window x:Class="MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="MainWindow" Height="200" Width="200">
  <Window.Resources>
    <Style TargetType="Button">
      <Setter Property="Background" Value="LightGreen"/>
    </Style>
  </Window.Resources>

  <StackPanel>
    <Grid>
      <!-- 親要素(Window.Resources) の Style が反映される -->
      <Button Content="Button"/>
    </Grid>

    <Grid>
      <Grid.Resources>
        <!-- BasedOn がないと  Window.Resources での設定が反映されない -->
        <Style TargetType="Button">
          <Setter Property="Foreground" Value="White"/>
        </Style>
      </Grid.Resources>
      <Button Content="Button"/>
    </Grid>

    <Grid>
      <Grid.Resources>
        <!-- BasedOn を付加すると親要素(Window.Resources) の Style が反映される -->
        <Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
          <Setter Property="Foreground" Value="White"/>
        </Style>
      </Grid.Resources>
      <Button Content="Button"/>
    </Grid>
  </StackPanel>
</Window>

 すると表示は以下のようになります。

 一番上の Button は Window.Resources の Style の通り背景色が緑で表示されます。
 しかし、その下の Button は Grid.Resources で文字色を設定したために、背景色がデフォル(灰色)に戻ってしまっています。
 一番下の Button は、BasedOn により親の Style を継承しているので、背景色は緑のまま、文字色を白にすることができています。






カテゴリー: Program, xaml

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org