2010-10-04 5 views
13

Ho un problema con Silverlight Ho usato due giorni per combattere: un modello con uno stile controlla un pulsante. Nel pulsante concreto ho una tela con percorsi come contenuto. Il problema è che voglio che i percorsi riempiano il colore per legarlo in primo piano dal ContentControl nel modello.Associare una proprietà di riempimento in un percorso a una proprietà in primo piano dal ContentControl in uno stile

Tuttavia, non sono stato in grado di capire come costruire l'associazione per arrivare a Forground. Se, ad esempio, utilizzassi un TextBlock, otterrà automaticamente il colore Forground dallo stile. Come previsto, il testo ha un colore di primo piano. Il motivo per il binding è che l'animazione controlla il forground e io lo voglio propagare al colore di riempimento del percorso. Qualche idea?

il modello contiene la seguente:

<Style x:Key="PathButtonStyle" TargetType="Button"> 

... Animations and state stuff 

    <Border x:Name="ButtonBackground" BorderBrush="{TemplateBinding BorderBrush}" > 
    <ContentControl x:Name="ContentContainer" 
     ContentTemplate="{TemplateBinding ContentTemplate}" 
     Content="{TemplateBinding Content}" 
     Foreground="{TemplateBinding Foreground}" /> 
    </Border> 
</Style> 

giù nel mio layout ho il seguente:

<Button x:Name="Play" Style="{StaticResource PathButtonStyle}" > 
    <Canvas x:Name="PlayIcon"> 
    <Path Data="F1M191.4839,96.1763L177.9149,106.5173L177.9149,85.9293z" 
      Fill="{PATH TO CONTENTCONTROLS FOREGROUND}" /> 
    </Canvas> 
</Button> 

ho cleand il codice e roba per renderlo più leggibile rimosso, ma Spero che tu abbia capito l'idea.

risposta

9

Dal momento che hai dato un nome al pulsante, è possibile utilizzare il Binding ElementName parametri:

<Button x:Name="Play" Style="{StaticResource PathButtonStyle}" > 
    <Canvas x:Name="PlayIcon"> 
     <Path Data="F1M191.4839,96.1763L177.9149,106.5173L177.9149,85.9293z" 
      Fill="{Binding Foreground, ElementName=Play}" /> 
    </Canvas> 
</Button> 
+3

Non aiuta l'animazione in primo piano. Sto cercando una soluzione. –

1

In realtà anziché impostare Canvas come contenuto nel pulsante, è possibile inserirlo in Templete.

 <Style x:Key="PathButtonStyle" TargetType="Button"> 

    ... Animations and state stuff 
    <Canvas x:Name="PlayIcon"> 
    <Path Data="F1M191.4839,96.1763L177.9149,106.5173L177.9149,85.9293z" 
      Fill="{TemplateBinding Foreground}" /> 
    </Canvas> 
     <Border x:Name="ButtonBackground" BorderBrush="{TemplateBinding BorderBrush}" > 
     <ContentControl x:Name="ContentContainer" 
      ContentTemplate="{TemplateBinding ContentTemplate}" 
      Content="{TemplateBinding Content}" 
      Foreground="{TemplateBinding Foreground}" /> 
     </Border> 
    </Style> 

puoi fare tutto ciò che vuoi se utilizzi questo scenario.

+5

Questa risposta non ha senso, il percorso __is__ il contenuto, perché preoccuparsi di avere un modello per tutti se solo un percorso è mai necessario. L'idea è di essere in grado di posizionare una varietà di percorsi diversi in un pulsante stilizzato. – AnthonyWJones

+0

Ho spostato Canvas sul Template perché lì potrò collegarmi a ContentContainer. Per quanto ne so, non c'è altro modo per farlo. Di solito potresti preoccuparti di avere Template anche se è necessario un Path (semplicemente perché potresti bisogno di alcuni cambiamenti di modello ...). Anche se la risposta sopra è la strada da percorrere per il problema attuale. – Sonosar

0

Binding per ContentControl dovrebbe aiutare (Silverlight 5):

<Button x:Name="Play" Style="{StaticResource PathButtonStyle}" > 
    <Canvas x:Name="PlayIcon"> 
     <Path Data="F1M191.4839,96.1763L177.9149,106.5173L177.9149,85.9293z" 
       Fill="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType=ContentControl}}" /> 
    </Canvas> 
</Button>