2010-11-22 36 views
0

que je suis les réponses dans ce fil ici: Access codebehind variable in XAMLBind éléments RenderTransform à code-behind des variables

Voici ce que je suis en train de faire:

<Rectangle Name="MyRect" Fill="AliceBlue" MouseDown="Rectangle_MouseDown"> 
    <Rectangle.RenderTransform> 
     <TransformGroup> 
      <RotateTransform Angle="0" CenterX="300" CenterY="150"/> 
      <TranslateTransform X="{DynamicResource TransX}" Y="0"/> 
     </TransformGroup> 
    </Rectangle.RenderTransform> 
</Rectangle> 

Ensuite, j'ai une variable dans mon code derrière lequel est changé. Il est appelé TransX et je l'ajouter comme une ressource:

public double TransX = 0; 

public SvgPreview() 
{ 
    InitializeComponent(); 
    SvgPreview1.Resources.Add("TransX", TransX); 
} 

Le rectangle ne se transforme correctement dès le début, mais les transformations ne sont pas re-rendus pour refléter les changements dans la variable TransX. Que devrais-je faire?

Aussi, je dois faire exactement la même chose pour plusieurs autres valeurs.

Répondre

1

Je pense que vous devriez faire en sorte que SvgPreview implémente INotifyPropertyChanged, le définir en tant que DataContext de certains parents de votre Rectangle, et transformer TransX en une propriété et y accéder via DataBinding.

Edit: Comme ceci:

<Rectangle Name="MyRect" Fill="AliceBlue" MouseDown="Rectangle_MouseDown"> 
    <Rectangle.RenderTransform> 
     <TransformGroup> 
      <RotateTransform Angle="0" CenterX="300" CenterY="150"/> 
      <TranslateTransform X="{Binding TransX}" Y="0"/> 
     </TransformGroup> 
    </Rectangle.RenderTransform> 
</Rectangle> 


class SvgPreview : INotifyPropertyChanged 
// ...... 
private double transX; 
public double TransX 
{ 
    get { return transX; } 
    set 
    { 
     if(transX != value) 
     { 
      transX = value; 
      OnNotifyPropertyChanged("TransX"); 
     } 
    } 
}     

public SvgPreview() 
{ 
    InitializeComponent(); 
    TransX = 0; 
} 

et dans le CodeBehehind de Windows/Page/contrôle qui contient votre rectangle;

// ... 
InitializeCompenent(); 
this.DataContext = new SvgPreview(); 
// ... 
+0

Je suis assez confus. Je n'ai pas une telle méthode appelée "OnNotifyPropertyChanged" –

+0

+1, je viens d'ajouter le même exemple :) –

+0

@Adam: Désolé, cela ressemble à ceci: public void OnPropertyChanged (String propertyName) {if (PropertyChanged! = null) PropertyChanged (this, nouveau PropertyChangedEventArgs (propertyName)); } ' – Jens