キャンバスに図形の動的なコレクションを追加するには、通常、そのItemsPanel
としてキャンバスでのItemsControlを宣言します。 Canvasのプロパティーは、抽象的に形状データを表すデータ項目の集合にバインドされます。 ItemsControlのItemTemplate
は、個々のアイテムを視覚化する責任があります。
<ItemsControl ItemsSource="{Binding ShapeItems}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Path Data="{Binding Geometry}"
Stroke="{Binding Stroke}"
StrokeThickness="2"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
データアイテムクラスを定義するビューモデルは、次のようになります。 Geometry
およびStroke
プロパティの他に、視覚的な外観を定義するその他のプロパティがあることに注意してください。
public class ShapeItem
{
public Geometry Geometry { get; set; }
public Brush Stroke { get; set; }
}
public class ViewModel
{
public ObservableCollection<ShapeItem> ShapeItems { get; }
= new ObservableCollection<ShapeItem>();
}
、あなたはこのようなあなたのメインウィンドウでそれをインスタンス化し、初期化するかもしれません:
public MainWindow()
{
InitializeComponent();
var vm = new ViewModel();
vm.ShapeItems.Add(new ShapeItem
{
Geometry = new LineGeometry(new Point(100, 100), new Point(200, 200)),
Stroke = Brushes.Green
});
vm.ShapeItems.Add(new ShapeItem
{
Geometry = new LineGeometry(new Point(200, 200), new Point(100, 300)),
Stroke = Brushes.Red
});
DataContext = vm;
}
あなたは今ShapeItemクラスに
public class ShapeItem
{
public Geometry Geometry { get; set; }
public Brush Stroke { get; set; }
public int ZIndex { get; set; }
}
をZIndex
プロパティを追加し、追加することができますItemsControlに次のように入力します。
<ItemsControl ItemsSource="{Binding ShapeItems}">
...
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Panel.ZIndex" Value="{Binding ZIndex}"/>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
ShapeItemクラスは、その特性がコレクションに追加された後、それらの値を変更する場合にINotifyPropertyChanged
インタフェースを実装しなければなりません。
DrawingContextでは、zオーダーは要素を描画する順序によって決まります。 DrawingContextをまったく使用している理由は明確ではありません。なぜLine要素をCanvasに追加しないのですか? – Clemens
実際に描画する線の位置と数は動的なので、線要素をキャンバスに追加することは可能ですか?はいの場合は、その方法を教えてください。 –