Question

Quelqu'un sait s'il est possible de lier les données ScaleX et ScaleY d'une transformation de rendu dans Silverlight 2 Beta 2 ?Les transformations de liaison sont possibles dans WPF - Mais j'obtiens une erreur lors de la configuration de ma liaison dans Silverlight via XAML.Peut-être est-il possible de le faire via du code ?

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

Je souhaite lier les ScaleX et ScaleY de l'élément ScaleTransform.

J'obtiens une erreur d'exécution lorsque j'essaie d'effectuer une liaison avec une double propriété sur mon contexte de données :

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

Ma liaison ressemble à ceci :

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

J'ai vérifié trois fois que le chemin de liaison est correct - je lie une barre de défilement avec la même valeur et cela fonctionne très bien...

La visibilité est de type double et est un nombre compris entre 0,0 et 30,0.J'ai un convertisseur de valeur qui réduit ce nombre à 0,5 et 1 - je souhaite augmenter la taille du poisson en fonction de la clarté de l'eau.Donc je ne pense pas que ce soit un problème avec le type contre lequel je m'engage...

Était-ce utile?

La solution

ScaleTransform n'a pas de contexte de données, il est donc très probable que la liaison recherche SelectedDive.Visibility par elle-même et ne le trouve pas.Il y a beaucoup de choses dans Silverlight xaml et la liaison de données qui sont différentes de WPF...

Quoi qu'il en soit, pour résoudre ce problème, vous souhaiterez configurer la liaison dans le code**, ou écouter manuellement l'événement PropertyChanged de votre objet de données et définir l'échelle dans le code derrière.

Je choisirais cette dernière si vous vouliez faire une animation/storyboard pour le changement d'échelle.

** Je dois vérifier mais vous ne pourrez peut-être pas vous y lier.si je me souviens bien, si le RenderTransform ne fait pas partie d'une animation, il est transformé en une transformation matricielle et tous les paris sont ouverts.

Autres conseils

Est-ce une erreur d'exécution ou de compilation, Jonas ?En regardant le Documentation, ScaleX et ScaleY sont des propriétés de dépendance, vous devriez donc pouvoir écrire

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

...où Foo et Bar sont du type approprié.

Modifier:Bien sûr, c'est la documentation WPF.Je suppose qu'il est possible qu'ils aient modifié ScaleX et ScaleY pour qu'ils soient des propriétés standard plutôt que des propriétés de dépendance dans Silverlight.J'aimerais en savoir plus sur l'erreur que vous voyez.

Ah, je pense que je vois ton problème.Vous essayez de lier une propriété de type Visibility (SelectedDive.Visibility) à une propriété de type Double (ScaleTransform.ScaleX).WPF/Silverlight ne peut pas convertir entre ces deux types.

Qu'est-ce que vous essayez d'accomplir?Peut-être que je peux vous aider avec le XAML.Qu'est-ce que « SelectedDive » et que voulez-vous qu'il se passe lorsque sa visibilité change ?

Désolé, je cherchais à augmenter le nombre de réponses, donc je n'avais pas réalisé que vous aviez modifié la question avec plus d'informations.

OK, donc la visibilité est de type Double, donc la liaison devrait fonctionner à cet égard.

Pour contourner le problème, pourriez-vous essayer de lier vos valeurs ScaleX et ScaleY directement au contrôle de curseur auquel SelectedDive.Visibility est lié ?Quelque chose comme:

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

Si cela fonctionne, cela vous permettra au moins de démarrer.

Modifier:Ah, je viens de me rappeler que j'avais lu une fois que Silverlight ne prenait pas en charge la syntaxe ElementName dans les liaisons, donc cela pourrait ne pas fonctionner.

Ouais, peut-être que les transformations de rendu intégrées n'héritent pas du DataContext de l'objet auquel elles s'appliquent.Pouvez-vous forcer le DataContext à y entrer ?Par exemple, donnez un nom à la transformation :

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

...puis dans votre code-behind :

myScaler.DataContext = fishImage.DataContext;

...afin que le scaler partage définitivement son DataContext avec l'image.

Ok, l'image elle-même récupère-t-elle correctement le DataContext ?

Essayez d'ajouter ceci :

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

Si cela compile et s'exécute, survolez l'image et voyez si elle affiche la bonne valeur.

J'espérais résoudre ce problème via XAML, mais il s'avère que la suggestion de Brian était la voie à suivre.J'ai utilisé la suggestion de Matt pour donner un nom à la transformation d'échelle, afin de pouvoir y accéder à partir du code.Ensuite, j'ai accroché l'événement de modification de valeur du curseur et j'ai mis à jour manuellement les propriétés ScaleX et ScaleY.J'ai conservé mon convertisseur de valeur pour passer de la plage de visibilité (0-30 m) à l'échelle (0,5 à 1).Le code ressemble à ceci :

    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;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top