2011-06-14 12 views
7

Esta es la forma I reproducido este problema en WPF:TemplateBinding no funciona en ciertos casos (cuando se utiliza TranslateTransform)

Crear un control personalizado:

public class TestCustomControl : Control 
{ 
static TestCustomControl() 
{ 
    DefaultStyleKeyProperty.OverrideMetadata(typeof(TestCustomControl), new FrameworkPropertyMetadata(typeof(TestCustomControl))); 
} 

public string Text 
{ 
    get { return (string)GetValue(TextProperty); } 
    set { SetValue(TextProperty, value); } 
} 

// Using a DependencyProperty as the backing store for Text. This enables animation, styling, binding, etc... 
public static readonly DependencyProperty TextProperty = 
    DependencyProperty.Register("Text", typeof(string), typeof(TestCustomControl), new PropertyMetadata("Hello")); 

public double OffSet 
{ 
    get { return (double)GetValue(OffSetProperty); } 
    set { SetValue(OffSetProperty, value); } 
} 

// Using a DependencyProperty as the backing store for OffSet. This enables animation, styling, binding, etc... 
public static readonly DependencyProperty OffSetProperty = 
    DependencyProperty.Register("OffSet", typeof(double), typeof(TestCustomControl), new PropertyMetadata(5.0)); 
} 

Añadir un estilo para que en el genérico. archivo XAML:

<Style TargetType="local:TestCustomControl"> 
<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="local:TestCustomControl"> 
      <Grid> 
       <TextBlock Text="{TemplateBinding Text}"></TextBlock> 
       <TextBlock Text="{TemplateBinding Text}"> 
        <TextBlock.RenderTransform> 
         <TranslateTransform X="{TemplateBinding OffSet}" Y="{TemplateBinding OffSet}"/> 
         <!--<TranslateTransform X="10" Y="10"/>--> 
        </TextBlock.RenderTransform> 
       </TextBlock> 
      </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

luego añadirlo a la ventana principal:

<local:TestCustomControl OffSet="32" Text="the off set is not working" FontSize="36"> 

    </local:TestCustomControl> 

Luego, ejecute la aplicación, resultó que el "Texto" funciona bien, pero el "Desactivado" no funciona. Y probé algo similar en el entorno de desarrollo de Windows Phone 7, y obtuve el mismo resultado.

¿Cómo debo modificar el código para que OffSet funcione?

Gracias

+0

De acuerdo con "WPF 4.5 Unleashed", Nathan, Adam; 3ª ed. do. 2014, p. 437, no puede usar 'TemplateBinding' en las propiedades de' Freezeable'. 'TranslateTransform' es un' Freezeable', por eso no funcionó (mientras que 'TextBlock' no es' Freezeable', por eso funcionó allí). Lo desconcertante es que no se trata de un error en tiempo de ejecución (o en cualquier otro momento). Simplemente falla en silencio. –

Respuesta

17

Probar:

{Binding Offset, RelativeSource={RelativeSource TemplatedParent}} 
+0

funciona para wpf, no para WP7 – CuiPengFei

+0

recién probado nuevamente, no funciona para Silverlight3, funciona para Silverlight4. – CuiPengFei

+1

WP7.0 tiene un "Silverlight 4" bastante diluido. La implementación de Silverlight4 incluida con WP7.1 (también conocida como Mango) es mucho más completa y la solución de CuiPengFei probablemente comenzará a funcionar. –

1

Ambos TemplateBing y RelativeSource no funcionan, por lo que sólo se olvidan de que si se dirigen a WP7.0 (Silverlight 3). Utiliza otras formas de solucionarlo. De hecho, cambié manualmente los valores X/Y de cada transformación cada vez que se cambia el "OffSet".

Cuestiones relacionadas