2014-02-07 1 views
8

Wie X, Y-Koordinaten von WPF Canvas Kinder durch Code festlegen? Unten ist mein Beispielcode.Wie setze ich x, y Koordinaten von WPF Canvas Children über Code?

Canvas root = new Canvas(); 
double y = 5; 
for (int i=0; i< 10; i++) 
{ 
    Ellipse e = new Ellipse(); 
    e.Height=10; 
    e.Width=10; 
    e.Stroke =Brushes.Black; 

    root.Children.Add(e); 
    y +=10; 
} 

MyRootCanvas = root; 

MyRootCanvas ist eine Eigenschaft des Typs Canvas, die an den Inhalt von WPF UserControl gebunden ist.

+0

@HighCore Ich muss die Steuerelemente dynamisch laden. – user2330678

+1

Verwenden Sie dann ein 'ItemsControl'. WPFs Idee von "dynamisch" unterscheidet sich wirklich von anderen Technologien. Ich schlage vor, dass Sie lernen, WPF richtig zu verwenden, sonst werden Sie aufgrund der Komplexität des Visual Tree alle möglichen Probleme haben. –

+0

@HighCore Ich verwende ein ItemsControl. Mein UserControl wird in ein ItemsControl geladen. – user2330678

Antwort

11

Verwenden Canvas.SetLeft und Canvas.SetTop Methoden Satz x, y für Kinder koordinieren:

for (int I=1; I<= 10; I++) 
{ 
    Ellipse e = new Ellipse(); 
    e.Height=10; 
    e.Width=10; 
    e.Stroke =Brushes.Black; 

    Canvas.SetLeft(e, 10); <-- HERE 
    Canvas.SetTop(e, Y); 

    root.Children.Add(e); 
    Y +=10; 
} 
+0

Sind Sie sich der Reihenfolge sicher? Sollte das Kind nicht hinzugefügt werden, bevor seine Position festgelegt wird. Wie auch immer, ich habe das getan und es funktioniert daher würde ich Ihre Antwort markieren, aber, bitte korrigieren Sie es für andere Benutzer. – user2330678

+2

'Canvas.SetLeft' und' Canvas.SetTop' sind statische Methoden von Canvas. Und Sie können es vor dem Hinzufügen von Element zu Canvas festlegen. Angehängte Eigenschaften können immer festgelegt werden, bevor Elemente in übergeordneten Elementen hinzugefügt werden. –

9

Ich weiß, diese Frage schon beantwortet wurde, aber was HighCore redet (dh manipulieren keine UI-Elemente in Code) kann nicht stark genug angegeben werden. Um dies zu tun richtig sollten Sie eine Klasse erstellen, die Daten, die Sie anzeigen möchten, kapseln:

public class Widget : ViewModelBase 
{ 
    private double _X; 
    public double X 
    { 
     get { return _X;} 
     set { _X = value; RaisePropertyChanged(() => this.X); } 
    } 

    private double _Y; 
    public double Y 
    { 
     get { return _Y;} 
     set { _Y = value; RaisePropertyChanged(() => this.Y); } 
    } 

    private double _Width; 
    public double Width 
    { 
     get { return _Width;} 
     set { _Width = value; RaisePropertyChanged(() => this.Width); } 
    } 

    private double _Height; 
    public double Height 
    { 
     get { return _Height;} 
     set { _Height = value; RaisePropertyChanged(() => this.Height); } 
    } 

    private System.Windows.Media.Color _Color; 
    public System.Windows.Media.Color Color 
    { 
     get { return _Color;} 
     set { _Color = value; RaisePropertyChanged(() => this.Color); } 
    } 
} 

Es ist ein bisschen ärgerlich, diese Abhängigkeitseigenschaften für jeden Parameter erstellen zu müssen, verwende ich die integrierten Code-Snippets Manager erstellen ein Ausschnitt für mich, damit ich nicht jedes Mal das Ganze eintippen muss. Als nächstes wollen Sie ein Array von diesen erstellen und sie in einer Ansicht Modell irgendwo setzen, dass ist, wo die Logik Ihrer Ellipsen zu erzeugen gehen sollte:

public MyViewModel() 
{ 
    for (int y = 0; y < 10; y++) 
     for (int x = 0; x < 10; x++) 
      this.Items.Add(new Widget { 
       X = x * 20, 
       Y = y * 20, 
       Width = 10, 
       Height = 10, 
       Color = Color.FromArgb(255, (byte)(x * 20), (byte)(y * 20), 0) 
      }); 
} 

würden Sie dann eine Instanz von MyViewModel als Datenkontext gesetzt für das Fenster mit Ihrer Leinwand. Alles, was bleibt, ist die XAML, die zu dieser Ansicht Modell locker bindet, können Sie eine Liste der Elemente auf eine Leinwand machen möchten, so dass Sie Items und ersetzen Sie die Standardelemente Panel mit einer Leinwand verwenden:

<ItemsControl ItemsSource="{Binding Items}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Canvas /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Ellipse Width="{Binding Width}" Height="{Binding Height}"> 
       <Ellipse.Stroke> 
        <SolidColorBrush Color="{Binding Color}" /> 
       </Ellipse.Stroke> 
      </Ellipse> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.ItemContainerStyle> 
     <Style> 
      <Setter Property="Canvas.Left" Value="{Binding X}" /> 
      <Setter Property="Canvas.Top" Value="{Binding Y}" /> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
</ItemsControl> 

Und hier ist das Ergebnis :

circles

Sie haben nun Ihre Front-End zu Ihrer Ansicht Modell dagetenbundenen so können Sie Elemente oder ändern etc einzelnen Eigenschaften hinzufügen/entfernen und die Änderungen werden propagieren durch. Sie können Ihre Logik auch testen, ohne die Ansichts-Steuerelemente überhaupt erstellen zu müssen.

Verwandte Themen