我知道這個問題已經回答了,但什麼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="{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>
而這裏的結果:
現在你已經把前端數據綁定到您的視圖模型,以便您可以添加/刪除項目或更改個人屬性等及其變化將傳播通過。你也可以單元測試你的邏輯,而不必實際創建視圖控件。
@HighCore我需要動態加載控件。 – user2330678
然後使用'ItemsControl'。 WPF的「動態」概念與其他技術真的不同。我強烈建議你學會正確使用WPF,否則由於Visual Tree的複雜性,你會遇到各種各樣的麻煩。 –
@HighCore我正在使用ItemsControl。我的UserControl被加載到一個ItemsControl中。 – user2330678