我知道这个问题已经得到了回答,但是HighCore所说的(即不要在代码中操纵UI元素)足以强调。为了正确地做到这一点,您应该创建一个类来封装您想要显示的数据:
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); }
}
}
每次为每个参数创建这些依赖属性有点烦人,我使用内置的代码片段管理器为自己创建一个片段,这样我就不必每次都键入整个内容。接下来,您想要创建一个包含这些数组并将它们放在某个视图模型中,那就是生成省略号逻辑应该去的地方:
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)
});
}
然后,您将设置MyViewModel的实例作为包含画布的窗口的数据上下文。剩下的就是XAML,它会松散地绑定到此视图模型,您想要在画布上呈现项目列表,因此使用ItemsControl并将默认项面板替换为画布:
<ItemsControl ItemsSource="">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Ellipse Width="" Height="">
<Ellipse.Stroke>
<SolidColorBrush Color="" />
</Ellipse.Stroke>
</Ellipse>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="" />
<Setter Property="Canvas.Top" Value="" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
这里是结果:
现在你的前端数据与视图模型绑定,所以你可以添加/删除项目或更改单个属性等,更改将自动传播。你还可以进行单元测试来检查逻辑,而无需创建任何视图控件。
ItemsControl
。WPF对“动态”的理解与其他技术非常不同。我强烈建议您学会正确使用WPF,否则由于可视化树的复杂性,您将遇到各种麻烦。 - Federico BerasateguiItemsControl
,那么就没有必要在过程代码中创建或操作 UI 元素。这就是 XAML 的作用。请正确使用数据绑定。 - Federico Berasategui