WPF 使 Adorner 与 GuidelineSet 对齐

WPF align Adorner with GuidelineSet

我想创建一个简单的装饰器,用边界框标记选定的元素。我希望它清晰并且恰好是目标内容之外的一个像素。我找到了一些有用的代码,但它并没有像我想要的那样工作。

我的 SelectAdorner 的 OnRender 方法是:

Rect adornedElementRect = new Rect(AdornedElement.DesiredSize);

SolidColorBrush renderBrush = new SolidColorBrush(Colors.Transparent);
Pen renderPen = new Pen(new SolidColorBrush(Colors.LightBlue), 1);
double halfPenWidth = renderPen.Thickness / 2;

// Create a guidelines set
GuidelineSet guidelines = new GuidelineSet();
guidelines.GuidelinesX.Add(adornedElementRect.Left + halfPenWidth);
guidelines.GuidelinesX.Add(adornedElementRect.Right + halfPenWidth);
guidelines.GuidelinesY.Add(adornedElementRect.Top + halfPenWidth);
guidelines.GuidelinesY.Add(adornedElementRect.Bottom + halfPenWidth);
drawingContext.PushGuidelineSet(guidelines);

drawingContext.DrawRectangle(renderBrush, renderPen, adornedElementRect);

问题是边界框没有围绕内容正确对齐(请参阅第二项和第三项)。我希望结果是下图中底部项目的结果。

有什么想法可以实现我想要的吗?

此外,让装饰器以相同的方式工作并且 renderPen.Thickness 大于 1 会很好,以防我需要它。

感谢您的帮助。

在创建 GuidelineSet 之前需要添加以下代码:

adornedElementRect = new Rect(
    adornedElementRect.Left - halfPenWidth,
    adornedElementRect.Top - halfPenWidth,
    adornedElementRect.Width + renderPen.Thickness,
    adornedElementRect.Height + renderPen.Thickness
  );

问题出在考虑到笔的粗细时,adornedElementRect 与 AdornedElement 重叠。 AdornedElement.DesiredSize的值对应边框的外边缘。这意味着装饰器一半绘制在边界上方,一半绘制在边界外。然后,GuidelineSet 将垂直边缘的右侧和水平边缘的底部与像素边界对齐。这使得绘图看起来很清晰,但是边缘被移动到内部,或者移动到 AdornedElement 的外部。这就是创建工件的原因。

当向 adornedElementRect 添加指定的更改时,它会绘制在 AdornedElement 的外部并紧邻它。现在,GuidelineSet 将 Adorner 与 Border 控件类似地对齐。有关 WPF 如何在屏幕上绘制内容的详细信息,请参阅此 link