, 당신은 일반적으로 그 ItemsPanel
로 캔버스와 함께 ItemsControl을 선언합니다 :
다음은 필자가 현재 사용하고있는 샘플 코드입니다. 캔버스의 ItemsSource
속성은 추상적 인 방식으로 모양 데이터를 나타내는 데이터 항목 모음에 바인딩됩니다. 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>();
}
당신은 인스턴스화이처럼 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;
}
이
이제 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를 사용하고 있는지 명확하지 않습니다. Canvas에 Line 요소를 추가하지 않으시겠습니까? – Clemens
실제로 그릴 위치와 선의 수는 동적이므로 캔버스에 선 요소를 추가 할 수 있습니까? 그렇다면 그 방법을 알려주십시오. –