1

我正在使用DrawingContext.DrawLine函数来画线。但似乎线条会影响画布上其他线条的位置。所以我需要为所有行添加不同的 z-index 值。有什么方法可以绘制具有不同 z-index 的线条,这样它们就不会影响其他线条的位置。或者是否有任何其他方法可用于绘制线条,例如绘制我已将DrawText方法替换为TextBlock.

下面是我现在使用的示例代码:

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

1 回答 1

4

为了向 Canvas 添加动态形状集合,您通常会声明一个带有 Canvas 作为其ItemsPanel. Canvas的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;
}

您现在可以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接口,以防其属性在添加到集合后更改其值。

于 2016-11-21T12:28:16.880 回答