Pregunta

¿Alguien sabe si es posible vincular datos ScaleX y ScaleY de una transformación de renderizado en Silverlight 2 Beta 2?Es posible vincular transformaciones en WPF, pero aparece un error al configurar mi enlace en Silverlight a través de XAML.¿Quizás sea posible hacerlo mediante código?

<Image Height="60" HorizontalAlignment="Right" 
       Margin="0,122,11,0" VerticalAlignment="Top" Width="60" 
       Source="Images/Fish128x128.png" Stretch="Fill" 
       RenderTransformOrigin="0.5,0.5" x:Name="fishImage">
    <Image.RenderTransform>
         <TransformGroup>
             <ScaleTransform ScaleX="1" ScaleY="1"/>
             <SkewTransform/>
             <RotateTransform/>
             <TranslateTransform/>
         </TransformGroup>
    </Image.RenderTransform>
</Image>

Quiero vincular ScaleX y ScaleY del elemento ScaleTransform.

Recibo un error de tiempo de ejecución cuando intento vincularme a una propiedad doble en mi contexto de datos:

Message="AG_E_PARSER_BAD_PROPERTY_VALUE [Line: 1570 Position: 108]"

Mi enlace se ve así:

<ScaleTransform ScaleX="{Binding Path=SelectedDive.Visibility}" 
                ScaleY="{Binding Path=SelectedDive.Visibility}"/>

He verificado tres veces que la ruta de enlace es correcta: estoy vinculando una barra deslizante con el mismo valor y eso funciona bien...

La visibilidad es de tipo doble y es un número entre 0,0 y 30,0.Tengo un convertidor de valores que reduce ese número a 0,5 y 1. Quiero escalar el tamaño del pez dependiendo de la claridad del agua.Así que no creo que sea un problema con el tipo al que me estoy vinculando...

¿Fue útil?

Solución

ScaleTransform no tiene un contexto de datos, por lo que lo más probable es que el enlace busque SelectedDive.Visibility fuera de sí mismo y no lo encuentre.Hay muchas cosas en Silverlight xaml y enlace de datos que son diferentes de WPF...

De todos modos, para resolver esto, deberá configurar el enlace en el código**, o escuchar manualmente el evento PropertyChanged de su objeto de datos y configurar la Escala en el código subyacente.

Elegiría este último si quisieras hacer una animación/guión gráfico para el cambio de escala.

** Necesito comprobarlo, pero es posible que no puedas vincularte.Según recuerdo, si RenderTransform no es parte de una animación, se convierte en una transformación matricial y todas las apuestas están canceladas.

Otros consejos

¿Es un error de tiempo de ejecución o de tiempo de compilación, Jonas?Mirando a la documentación, ScaleX y ScaleY son propiedades de dependencia, por lo que debería poder escribir

<ScaleTransform ScaleX="{Binding Foo}" ScaleY="{Binding Bar}" />

...donde Foo y Bar son del tipo apropiado.

Editar:Por supuesto, esa es la documentación de WPF.Supongo que es posible que hayan cambiado ScaleX y ScaleY para que sean propiedades estándar en lugar de propiedades de dependencia en Silverlight.Me encantaría saber más sobre el error que estás viendo.

Ah, creo que veo tu problema.Está intentando vincular una propiedad de tipo Visibilidad (SelectedDive.Visibility) a una propiedad de tipo Doble (ScaleTransform.ScaleX).WPF/Silverlight no puede convertir entre esos dos tipos.

¿Qué está tratando de lograr?Quizás pueda ayudarte con el XAML.¿Qué es "SelectedDive" y qué desea que suceda cuando cambie su visibilidad?

Lo siento, estaba buscando que aumentara el recuento de respuestas, así que no me di cuenta de que habías editado la pregunta con más información.

Bien, entonces la visibilidad es de tipo Doble, por lo que el enlace debería funcionar en ese sentido.

Como solución alternativa, ¿podría intentar vincular los valores de ScaleX y ScaleY directamente al control deslizante al que está vinculado SelectedDive.Visibility?Algo como:

<ScaleTransform ScaleX="{Binding ElementName=slider1,Path=Value}" ... />

Si eso funciona, al menos te pondrá en marcha.

Editar:Ah, acabo de recordar que leí una vez que Silverlight no admite la sintaxis ElementName en los enlaces, por lo que es posible que no funcione.

Sí, tal vez las transformaciones de renderizado incrustadas no hereden el DataContext del objeto al que se aplican.¿Puedes forzar el DataContext en ellos?Por ejemplo, asigne un nombre a la transformación:

<ScaleTransform x:Name="myScaler" ... />

...y luego en tu código subyacente:

myScaler.DataContext = fishImage.DataContext;

...para que el escalador definitivamente comparta su DataContext con la imagen.

Ok, ¿la imagen misma está captando el contexto de datos correctamente?

Intenta agregar esto:

<Image Tooltip="{Binding SelectedDive.Visibility}" ... />

Si eso se compila y se ejecuta, coloque el cursor sobre la imagen y vea si muestra el valor correcto.

Esperaba resolver esto a través de XAML, pero resulta que la sugerencia de Brian era el camino a seguir.Utilicé la sugerencia de Matt para darle un nombre a la transformación de escala, de modo que pueda acceder a ella desde el código.Luego enganché el evento de cambio de valor del control deslizante y actualicé manualmente las propiedades ScaleX y ScaleY.Mantuve mi convertidor de valores para convertir del rango de visibilidad (0-30 m) a escala (0,5 a 1).El código se ve así:

    private ScaleConverter converter;

    public DiveLog()
    {           
        InitializeComponent();

        converter = new ScaleConverter();
        visibilitySlider.ValueChanged += new 
          RoutedPropertyChangedEventHandler<double>(visibilitySlider_ValueChanged);
    }        

    private void visibilitySlider_ValueChanged(object sender,   
                                        RoutedPropertyChangedEventArgs<double> e)
    {
        fishScale.ScaleX = (double)converter.Convert(e.NewValue, 
                                   typeof(double), null, CultureInfo.CurrentCulture);
        fishScale.ScaleY = fishScale.ScaleX;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top