Для того, чтобы добавить динамическую коллекцию фигур на холсте, вы, как правило, объявить ItemsControl с Canvas как его ItemsPanel
. Свойство ItemsSource
Canvas будет привязано к набору элементов данных, которые представляют данные формы абстрактным образом. ItemTemplate
of ItemsControl будет отвечать за визуализацию каждого отдельного элемента.
<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>
Модель представления, которая определяет класс элемента данных, будет выглядеть, как показано ниже. Обратите внимание, что помимо свойств и 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>();
}
, и вы можете создать экземпляр и инициализировать его в MainWindow, как это:
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;
}
Теперь Вы можете добавить ZIndex
свойство к классу ShapeItem
public class ShapeItem
{
public Geometry Geometry { get; set; }
public Brush Stroke { get; set; }
public int ZIndex { get; set; }
}
и добавить следующее в 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. Почему бы не добавить элементы линии на холст? – Clemens
На самом деле позиция и количество линий для рисования динамические, так что можно добавить элемент линии в холст? Если да, то, пожалуйста, дайте мне знать, как это сделать. –