Pregunta

Tengo un muy simple control de usuario que quiero enlazar una propiedad ScaleTransform a un DP en el código detrás de este modo:

<UserControl 
x:Name="RoundByRound"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
...
>

<Canvas x:Name="MyCanvas">
  <Canvas.RenderTransform>
    <TransformGroup>
      <ScaleTransform ScaleX="{Binding ZoomTransform.ScaleX, ElementName=RoundByRound}" 
                      ScaleY="{Binding ZoomTransform.ScaleY, ElementName=RoundByRound}"/>
      <SkewTransform/>
      <RotateTransform/>
      <TranslateTransform X="{Binding TranslateTransform.X, ElementName=RoundByRound}" 
                          Y="{Binding TranslateTransform.Y, ElementName=RoundByRound}"/>
     </TransformGroup>
   </Canvas.RenderTransform>
</Canvas>
</UserControl>

y luego en el código detrás hago esto:

ZoomTransform.ScaleX = 3;
ZoomTransform.ScaleY = 3;

Pero tengo un error que dice:

  

No se puede establecer una propiedad de objeto '...' porque está en un estado de sólo lectura.

Así que lo cambié a:

var cloned = ZoomTransform.Clone();
cloned.ScaleX = 3;
cloned.ScaleY = 3;
ZoomTransform = cloned;

Pero ahora que en realidad no hace nada ... ninguna escala se aplica a mi lienzo.

Sin embargo

Si quito la unión en la ScaleTransform y simplemente como un elemento XAML vacío:

<ScaleTransform />

A continuación, en mi código hago esto:

(MyCanvas.RenderTransform as TransformGroup).Children[0] = new ScaleTransform(3, 3);

Funciona! Me conseguir aplicar la escala

Así que 2 preguntas:

  1. ¿Por qué mi Transform Frozen es el primer lugar?
  2. ¿Por qué doesnt mi trabajo vinculante cuando clonar el transformar?

Gracias a todos!

ACTUALIZACIÓN:

Esta es la definición de la DP:

public static readonly DependencyProperty TranslateTransformProperty = DependencyProperty.Register("TranslateTransform",
            typeof(TranslateTransform),
            typeof(RoundByRoundControl),
            new PropertyMetadata(new TranslateTransform { X = 0, Y = 0 }));

        public static readonly DependencyProperty ZoomTransformProperty = DependencyProperty.Register("ZoomTransform",
            typeof(ScaleTransform),
            typeof(RoundByRoundControl),
            new PropertyMetadata(new ScaleTransform { ScaleX = 1, ScaleY = 1 }));

        public TranslateTransform TranslateTransform
        {
            get { return (TranslateTransform)GetValue(TranslateTransformProperty); }
            set { SetValue(TranslateTransformProperty, value); }
        }

        public ScaleTransform ZoomTransform
        {
            get { return (ScaleTransform)GetValue(ZoomTransformProperty); }
            set { SetValue(ZoomTransformProperty, value); }
        }
¿Fue útil?

Solución

El ScaleTransform que se pasa como su valor por defecto de su propiedad ZoomTransform está congelada por el PropertyMetadata. Una vez que el PropertyMetadata es pasado al método Registro se serán congelados / sellado.

  

Sin embargo, una vez que los metadatos se consume   como parte de una llamada para registrarse,   AddOwner o OverrideMetadata, la   sistema de propiedad que sellará   instancia de metadatos y las propiedades   Ahora se consideran inmutables.   El intento de establecer una vez ValorPredeterminado   IsSealed es cierto en estos metadatos   instancia emitirá una excepción.

Desde el ScaleTransform es un Freezable, se congela como parte de este proceso.

En cuanto a la segunda pregunta que, en base al código que ya ha proporcionado sí se aplica correctamente el ScaleTransform cuando se clona el ZoomTransform. Tiene que haber algo más en juego que no se ha incluido.

Esto es suponiendo que el XAML para su control de usuario incluye una x:. Atributo de clase que une al archivo de código subyacente para RoundByRoundControl

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top