2016-11-21 5 views
1

Я использую функцию DrawingContext.DrawLine для рисования линий. Но это похоже на линии, влияющие на положение других линий на холсте. Поэтому мне нужно добавить разные значения z-index для всех строк. Есть ли способ рисовать линии с разными z-индексами, чтобы они не влияли на положение других линий. Или есть ли какой-либо другой метод для рисования линий, например, для рисования текста, который я заменил DrawText с помощью метода TextBlock.Как нарисовать несколько строк с разными индексами z в C# wpf application

Ниже приведен пример кода, я использую прямо сейчас:

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. Почему бы не добавить элементы линии на холст? – Clemens

+0

На самом деле позиция и количество линий для рисования динамические, так что можно добавить элемент линии в холст? Если да, то, пожалуйста, дайте мне знать, как это сделать. –

ответ

3

Для того, чтобы добавить динамическую коллекцию фигур на холсте, вы, как правило, объявить 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 в случае его свойства изменять свои значения после того, как были добавлены в коллекцию.

 Смежные вопросы

  • Нет связанных вопросов^_^