2016-11-21 1 views
1

私はDrawingContext.DrawLine線を描画する関数を使用しています。しかし、それはキャンバス上の他の線の位置に影響する線のようです。ですから、私はすべての行に異なるZ-インデックス値を追加する必要があります。異なるZ-インデックスを持つ線を描画する方法はありますか?他の線の位置には影響しません。または、私はTextBlockDrawTextメソッドを置き換えたテキストを描画するような線を描画するための他の方法があります。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をまったく使用している理由は明確ではありません。なぜLine要素をCanvasに追加しないのですか? – Clemens

+0

実際に描画する線の位置と数は動的なので、線要素をキャンバスに追加することは可能ですか?はいの場合は、その方法を教えてください。 –

答えて

3

キャンバスに図形の動的なコレクションを追加するには、通常、その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インタフェースを実装しなければなりません。

関連する問題