简体   繁体   English

WPF模糊装饰器

[英]WPF blurry adorner

I'm implementing some drag/drop functionality on a treeview. 我正在树视图上实现一些拖放功能。

I'm trying to draw an insertion point marker, but it's coming out blurry: 我正在尝试绘制一个插入点标记,但是它变得模糊了:

在此处输入图片说明

How can I make it render crisply and sharp? 如何使它清晰而锐利地渲染?

This is my template: 这是我的模板:

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

This is my render logic: 这是我的渲染逻辑:

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);
        }
    }
}

I've been playing with UseLayoutRounding and SnapToDevicePixels in the adorner constructor but it seems I'm missing something. 我一直在装饰器构造函数中使用UseLayoutRoundingSnapToDevicePixels ,但似乎我缺少了一些东西。

With the guidance of Brian and some tinkering this seems to fix the issue. 在布赖恩(Brian)的指导和一些修补下,这似乎可以解决问题。 The main problem I kept having after Brian's comment was that the guidlines needed half a pen width extra for them to work. 在Brian发表评论后,我一直面临的主要问题是,指导方针需要多半个笔宽才能使它们起作用。 I only found this out by searching for examples, but no hint on MSDN. 我只是通过搜索示例发现了这一点,但是在MSDN上却没有任何提示。 Here is my functioning code: 这是我的运行代码:

    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);
            }
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM