WPF模糊的装饰

时间:2016-01-15 16:01:09

标签: c# wpf

我在树视图上实现了一些拖放功能。

我试图绘制插入点标记,但它模糊不清:

enter image description here

如何让它呈现清晰锐利?

这是我的模板:

.ToList()

这是我的渲染逻辑:

<HierarchicalDataTemplate DataType="{x:Type localvm:TreeViewItemViewModel}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}">
    <i:Interaction.Behaviors>
        <b:TreeViewItemDragBehavior/>
        <b:TreeViewItemDropBehavior/>
    </i:Interaction.Behaviors>
</TextBlock>

我在装饰构造函数中一直在玩protected override void OnRender(DrawingContext drawingContext) { Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize); SolidColorBrush renderBrush = new SolidColorBrush(Colors.Blue); renderBrush.Opacity = 0.5; Pen renderPen = new Pen(new SolidColorBrush(Colors.Blue), 1.5); if (IsInUpperHalf) { drawingContext.DrawLine(renderPen, adornedElementRect.TopLeft, adornedElementRect.TopRight); Point point1 = new Point(adornedElementRect.TopLeft.X + 10, adornedElementRect.TopLeft.Y); Point point2 = new Point(adornedElementRect.TopLeft.X, adornedElementRect.TopLeft.Y + 3); StreamGeometry leftStreamGeometry = new StreamGeometry(); using (StreamGeometryContext geometryContext = leftStreamGeometry.Open()) { geometryContext.BeginFigure(adornedElementRect.TopLeft, true, true); PointCollection points = new PointCollection { point1, point2 }; geometryContext.PolyLineTo(points, true, true); drawingContext.DrawGeometry(Brushes.Blue, new Pen(Brushes.Blue, 1), leftStreamGeometry); } StreamGeometry rightStreamGeometry = new StreamGeometry(); using (StreamGeometryContext geometryContext = rightStreamGeometry.Open()) { geometryContext.BeginFigure(adornedElementRect.TopRight, true, true); PointCollection points = new PointCollection { point3, point4 }; geometryContext.PolyLineTo(points, true, true); drawingContext.DrawGeometry(Brushes.Blue, new Pen(Brushes.Blue, 1), rightStreamGeometry); } } } UseLayoutRounding,但似乎我错过了一些东西。

1 个答案:

答案 0 :(得分:1)

在Brian的指导和一些修补之后,这似乎解决了这个问题。在Brian的评论之后,我一直存在的主要问题是指导线需要半个笔宽才能让他们工作。我只是通过搜索示例找到了这个,但没有在MSDN上提示。这是我的功能代码:

    protected override void OnRender(DrawingContext drawingContext)
    {
        Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);
        Pen renderPen = new Pen(new SolidColorBrush(Colors.Blue), 1);
        double halfPenWidth = renderPen.Thickness / 2;

        GuidelineSet guidelines = new GuidelineSet();
        guidelines.GuidelinesX.Add(adornedElementRect.TopLeft.X + halfPenWidth);
        guidelines.GuidelinesX.Add(adornedElementRect.BottomRight.X + halfPenWidth);
        guidelines.GuidelinesY.Add(adornedElementRect.TopLeft.Y + halfPenWidth);
        guidelines.GuidelinesY.Add(adornedElementRect.BottomRight.Y + halfPenWidth);
        drawingContext.PushGuidelineSet(guidelines);


        if (IsInUpperHalf)
        {
            drawingContext.DrawLine(renderPen, adornedElementRect.TopLeft, adornedElementRect.TopRight);
            StreamGeometry leftStreamGeometry = new StreamGeometry();
            using (StreamGeometryContext geometryContext = leftStreamGeometry.Open())
            {
                geometryContext.BeginFigure(adornedElementRect.TopLeft, true, true);
                geometryContext.LineTo(new Point(adornedElementRect.TopLeft.X + 10, adornedElementRect.TopLeft.Y), false, false);
                geometryContext.LineTo(new Point(adornedElementRect.TopLeft.X, adornedElementRect.TopLeft.Y + 3), false, false);
                drawingContext.DrawGeometry(Brushes.Blue, new Pen(Brushes.Blue, 1), leftStreamGeometry);
            }
            StreamGeometry rigthStreamGeometry = new StreamGeometry();
            using (StreamGeometryContext geometryContext = rigthStreamGeometry.Open())
            {
                geometryContext.BeginFigure(adornedElementRect.TopRight, true, true);
                geometryContext.LineTo(new Point(adornedElementRect.TopRight.X, adornedElementRect.TopRight.Y + 3), false, false);
                geometryContext.LineTo(new Point(adornedElementRect.TopRight.X - 10, adornedElementRect.TopRight.Y), false, false);
                drawingContext.DrawGeometry(Brushes.Blue, new Pen(Brushes.Blue, 1), rigthStreamGeometry);
            }
        }
    }