trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

ContentPresenterで表示されるコントロールにスタイルを適用するには?

ContentPresenterは、そのContentプロパティにバインドしたコントロールを子要素として表示します。
以下はTextBox型のコントロールを子要素として表示する例です。

<ContentPresenter Content="{Binding Path=MyTextBox}" />

ではこの子要素にスタイルを適用するにはどうすれば良いのでしょうか?
試しに以下のように書いてみました。

<Window.Resources>
     <Style TargetType="{x:Type TextBox}" x:Key="MyStyle">
         <Setter Property="Background" Value="Azure" />
     </Style>
</Window.Resources>
<Grid>
    <!-- このコードはコンパイルが通りません!!! -->
    <ContentPresenter Content="{Binding Path=MyTextBox}" Style="{StaticResource MyStyle}" />
</Grid>

しかし、「'TextBox' TargetType は、要素 'ContentPresenter' の型と一致しません。」
とエラーが表示され、コンパイルすることができません。予想通り当然ですね。

ではどうすればいいのでしょうか?
答えはContentPresenterのResourcesとしてスタイルを定義し、そのスタイルを子要素に適用すれば良いのです。

<ContentPresenter Content="{Binding Path=MyTextBox}">
    <ContentPresenter.Resources>
        <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource MyStyle}"/>
    </ContentPresenter.Resources>
</ContentPresenter>

簡単なことですが、要素の階層構造をきちんと理解していないとハマっていまいそうなネタでした。
実際私はハマりましたw