2016-11-21 1 views
1

줄을 그리는 데 DrawingContext.DrawLine 함수를 사용하고 있습니다. 그러나 그것은 캔버스에있는 다른 줄의 위치에 영향을 미치는 선과 같습니다. 그래서 모든 라인에 다른 Z- 인덱스 값을 추가해야합니다. Z- 인덱스가 다른 선을 그릴 수있는 방법이있어 다른 선의 위치에 영향을 미치지 않습니다. 또는 줄을 그릴 수있는 다른 방법이 있습니까? 예를 들어 DrawText 메서드를 대체 한 텍스트를 그릴 때 TextBlock을 사용합니다. 캔버스에 모양의 동적 모음을 추가하기 위해C# wpf 응용 프로그램에서 다른 z 색인을 사용하여 여러 줄을 그리는 방법

DrawingGroup dGroup = new DrawingGroup(); 
DrawingContext dc = dGroup.Open() 
dc.DrawLine(penScaleMarker, new Point((float)newPointX, (float)newPointY), new Point((float)newMinorEndX, (float)newMinorEndY)); 
+0

DrawingContext에서 z 순서는 요소를 그리는 순서에 따라 결정됩니다. 왜 정확히 DrawingContext를 사용하고 있는지 명확하지 않습니다. Canvas에 Line 요소를 추가하지 않으시겠습니까? – Clemens

+0

실제로 그릴 위치와 선의 수는 동적이므로 캔버스에 선 요소를 추가 할 수 있습니까? 그렇다면 그 방법을 알려주십시오. –

답변

3

, 당신은 일반적으로 그 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> 

데이터 항목 클래스를 정의하는보기 모델은 다음과 같습니다. GeometryStroke 속성 외에도 시각적 모양을 정의하는 다른 속성이있을 수 있습니다.

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 인터페이스를 구현해야합니다.

관련 문제