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