2010-11-22 4 views
0

ich im Anschluss an die in diesem Thread gegebenen Antworten hier: Access codebehind variable in XAMLBind Renderelemente an Code-behind Variablen

Hier ist, was ich versuche zu tun:

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

Dann habe ich eine Variable in meinem Code hinter dem sich ändert. Es heißt TransX und ich fügen Sie es als Ressource:

public double TransX = 0; 

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

Das Rechteck von Anfang an ordnungsgemäß umgewandelt wird erhalten, aber die Transformationen werden nicht neu gerendert Änderungen in der TransX Variable zu reflektieren. Was soll ich machen?

Auch muss ich genau dasselbe für mehrere andere Werte tun.

Antwort

1

Ich denke, Sie sollten SvgPreview implementieren INotifyPropertyChanged, setzen Sie es als DataContext eines Elternteils von Ihrem Rectangle, und ändern Sie TransX in eine Eigenschaft und greifen Sie über DataBinding.

Edit: So:

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

und im CodeBehehind von Windows/Seite/Steuerung, die Ihr Rectangle enthält;

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

Ich bin ziemlich verwirrt. Ich habe keine solche Methode namens "OnNotifyPropertyChanged" –

+0

+1, ich habe gerade das gleiche Beispiel :) –

+0

@Adam: Es sieht so aus: 'öffentliche void OnPropertyChanged (String propertyName) {if (PropertyChanged! = null) PropertyChanged (dies, neues PropertyChangedEventArgs (propertyName)); } ' – Jens

Verwandte Themen