我想创建一个简单的Adorner,用标记框标记所选元素。我希望它是锐利的,并且恰好是目标内容之外的一个像素。我发现了一些有用的代码,但它并不像我想要的那样完全正常工作。
我的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);
问题是边界框未在内容周围正确对齐(请参阅第二和第三项)。我希望结果是下图中底部项目的结果。
任何想法如何实现我的目标?
另外,如果我需要,那么让Adorner以renderPen.Thickness
大于1的相同方式工作会很好。
感谢您的帮助。
答案 0 :(得分:1)
在创建GuidelineSet之前,需要添加以下代码:
adornedElementRect = new Rect(
adornedElementRect.Left - halfPenWidth,
adornedElementRect.Top - halfPenWidth,
adornedElementRect.Width + renderPen.Thickness,
adornedElementRect.Height + renderPen.Thickness
);
问题来自于考虑笔厚度时adornedElementRect与AdornedElement重叠的事实。 AdornedElement.DesiredSize的值对应于边框的外边缘。这意味着Adorner被划到边界的一半,边界的一半。然后,GuidelineSet将垂直边缘的右侧和水平边缘的底侧与像素边界对齐。这使得绘图看起来很清晰,但是边缘会移动到内部,或者移动到AdornedElement的外部。这就是创建工件的原因。
将指定的更改添加到adornedElementRect时,会在AdornedElement的外部和右侧绘制。现在,GuidelineSet将Adorner与Border控件类似地对齐。有关WPF如何在屏幕上绘制内容的详细信息,请参阅此link。