2010-10-04 11 views
13

Tengo un problema de Silverlight que he usado dos días para luchar: una plantilla con un estilo controla un botón. En el botón concreto, tengo un lienzo con rutas como contenido. El problema es que quiero que las rutas de color de relleno se unan al primer plano desde ContentControl en la plantilla.Enlazar una propiedad de relleno en un camino a una propiedad de primer plano de ContentControl en un estilo

Sin embargo, no he podido averiguar cómo construir el enlace para llegar al Forground. Si quisiera, por ejemplo, utilizar un TextBlock, obtendrá automáticamente el color Forground del estilo. Como era de esperar, el texto tiene un color de primer plano. La razón del enlace es que la animación controla el forground y quiero que se propague al color de relleno de la ruta. ¿Algunas ideas?

La plantilla contiene lo siguiente:

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

Abajo en mi diseño he lo siguiente:

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

He cleand el código y cosas para hacerlo más legible eliminado, pero Espero que entiendas la idea detrás de esto.

Respuesta

9

Desde que dio un nombre a su botón, se puede utilizar el ElementName parámetro Encuadernación:

<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

No ayuda a la animación de primer plano. Me quedo buscando solución. –

1

En realidad, en lugar de configurar el lienzo como contenido en el botón, puede colocarlo en 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> 

puedes hacer lo que quieras si usas este escenario.

+5

esta pregunta no tiene sentido, el camino __is__ el contenido, ¿por qué molestarse en tener una plantilla si alguna vez se necesita una sola ruta? La idea es poder colocar una variedad de caminos diferentes en el botón de estilo. – AnthonyWJones

+0

Moví Canvas a la plantilla porque allí podré vincularme a ContentContainer. Hasta donde sé, no hay otra manera de hacerlo. En realidad, podrías molestarte en tener Template incluso si se necesita una ruta (simplemente porque podrías necesita algunos cambios de plantilla ...). Aunque la respuesta anterior es el camino a seguir para el problema actual. – Sonosar

0

La unión a ContentControl debería ayudar (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> 
Cuestiones relacionadas