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 :
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.
@HighCore Ich muss die Steuerelemente dynamisch laden. – user2330678
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. –
@HighCore Ich verwende ein ItemsControl. Mein UserControl wird in ein ItemsControl geladen. – user2330678