2013-11-21 4 views
6

wpf expanderのテンプレートをオーバーライドしました。 ヘッダは、私は内部のすべてのテキストブロックのための私のスタイルを追加しようとしたのContentPresenterContentPresenter内のすべての要素のスタイルを設定

<ContentPresenter x:Name="HeaderContent" 
        Grid.Column="1" 
        Margin="0,0,4,0" 
        HorizontalAlignment="Left" 
        VerticalAlignment="Center" 
        RecognizesAccessKey="True" 
        SnapsToDevicePixels="True" 
        > 
    <ContentPresenter.Resources> 
     <Style BasedOn="{StaticResource Expanderheader-Naming}" 
       TargetType="{x:Type TextBlock}" /> 
    </ContentPresenter.Resources> 
</ContentPresenter> 

を持っています。

<Expander Header="HelloWorld"> 

しかし、私は他の方法でそれを設定しようとすると、それはしていません: 私のスタイルは、私はプロパティとしてヘッダを設定した場合は動作します。

<Expander> 
    <Expander.Header> 
     <Grid x:Name="MyGrid"> 
      <TextBlock>Hello Man</TextBlock> 
     </Grid> 
    </Expander.Header> 
</Expander> 

ContentPresenter内のTextBlockにこのスタイルを設定するにはどうすればよいですか?

答えて

10

wpfで典型的なスタイルの継承問題が発生しました。

コントロールは、初期化されている時点でそのスタイルを探します。コントロールがそのスタイルを探す方法は、論理ツリー内を上に移動し、親のリソース辞書に格納されているスタイルが適切かどうかを論理親に尋ねることです。

あなたの例で間違っていることを説明すると、このように考えることができます。

最初の例では、ヘッダーはちょうど "HelloWorld"を格納しており、後でコントロールが初期化されるときに、 "HelloWorld"がContentPresenterに注入されます。このアプローチでは、 "HelloWorld"にContentPresenterが論理親であるため、スタイルが適切に適用されるため、スタイルが適切に適用されます。

グリッドを作成し、そのグリッド内にTextBlockを作成します。

コントロールの初期化時にTextBlockの論理的な親がGridであり、さらにGridの論理的な親がExpanderそのものです。 TextBlockのスタイルを探すとき、WPFはTextBlockのリソースに適切なスタイルを持っていて、答えがNOであればTextBlockの論理的な親に尋ねます。 Grid.Resourcesの中にTextBlockのための適切なスタイルはなく、Expander.Resources内にTextBlockのための適切なスタイルはありません。

適切なスタイルはContentPresenter内にあります。この場合、ContentPresenterは論理ツリーの一部ではありません。

これは、2番目の例でスタイルを失う方法です。

これを修正するには、最初の例に固執するか、スタイルが格納されている場所を変更することをお勧めします。通常、すべてのスタイルはWindow.Resources内に格納されます。

EDIT 2 慎重にこの例を見てみましょう:

<Window.Resources> 
    <Style x:Key="textBlockStyle" TargetType="TextBlock"> 
     <Setter Property="Background" Value="Blue"/> 
    </Style> 


    <Style TargetType="Button"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button"> 
        <ContentPresenter> 
         <ContentPresenter.Resources> 
          <Style TargetType="TextBlock" BasedOn="{StaticResource textBlockStyle}"/> 
         </ContentPresenter.Resources> 
        </ContentPresenter> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 
<StackPanel> 
    <Button Content="Yay, it worked!" /> 
    <Button> 
     <Grid> 
      <TextBox Text="It doesn't work this way!"/> 
     </Grid> 
    </Button> 
    <Button> 
     <Grid> 
      <Grid.Resources> 
       <Style TargetType="TextBlock" BasedOn="{StaticResource textBlockStyle}"></Style> 
      </Grid.Resources> 
      <TextBlock Text="Yay it works again! Woop Woop"/> 
     </Grid> 
    </Button> 
</StackPanel> 
+0

私は理解していないが、それはどういう意味かもしれ申し訳ありませんが、その私が使用している場合: <スタイルのTargetType = "{X:タイプグリッド} "> user1706449

関連する問題