2013-11-21 14 views
6

Ich überlagerte die Vorlage von WPF Expander. Der Header hat ContentStyle für alle Elemente in ContentPresenter setzen

<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> 

Wo ich versucht, meinen Stil für alle Textblocks nach innen zu addieren. Mein Stil funktioniert, wenn ich den Header als Eigenschaft:

<Expander Header="HelloWorld"> 

Aber es funktioniert nicht, wenn ich versuche, es in der anderen Art und Weise einzustellen.

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

Wie diesen Stil für alle TextBlocks innerhalb des ContentPresenter festlegen?

Antwort

10

Sie haben in WPF typisches Vererbungsproblem im Stil gefunden.

Ein Steuerelement sucht an dem Punkt, an dem es initialisiert wird, nach seinem Stil. Die Art und Weise, wie die Steuerelemente nach ihrem Stil suchen, besteht darin, in der logischen Struktur nach oben zu gehen und das logische übergeordnete Element nach dem geeigneten Stil für sie zu fragen, der im Ressourcenwörterbuch des übergeordneten Elements gespeichert ist.

Um Ihnen zu erklären, was Sie in Ihrem Beispiel falsch machen, lassen Sie uns so denken.

Im ersten Beispiel speichert die Kopfzeile nur "HelloWorld" und später, wenn die Steuerung initialisiert wird, wird "HelloWorld" in ContentPresenter eingefügt. Dieser Ansatz stellt "HelloWorld" bereit, wobei ContentPresenter ein logisches Elternelement ist und der Stil ordnungsgemäß angewendet wird, da der Stil gefunden werden kann.

Im zweiten Beispiel erstellen Sie ein Raster und in diesem Raster haben Sie einen TextBlock.

Zum Zeitpunkt der Kontrollinitialisierung ist das logische Parent Ihres TextBlocks Grid und darüber hinaus das logische Parent des Grid ist Expander selbst. Bei der Suche nach Stil für TextBlock fragt das WPF das logische Elternteil von TextBlock an, wenn es in seinen Ressourcen für den Textblock einen passenden Stil hat und die Antwort NEIN ist. Es gibt keinen richtigen Stil für den TextBlock in Grid.Resources und es gibt keinen passenden Stil für den TextBlock in Expander.Resources.

Der richtige Stil wäre in ContentPresenter nur in diesem Fall der ContentPresenter ist nicht Teil der logischen Struktur.

So verlieren Sie den Stil in Ihrem zweiten Beispiel.

Um dies zu beheben, empfehle ich Ihnen, beim ersten Beispiel zu bleiben oder zu ändern, wo der Stil gespeichert wird. Normalerweise sollten alle Stile in Window.Resources gespeichert werden.

EDIT 2 Werfen Sie einen Blick auf dieses Beispiel sorgfältig:

<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

Leider kann ich nicht verstehen, aber bedeutet es, dass, wenn ich benutze: user1706449