我绘制一些椭圆并将它们添加到网格中。
然后我想为每个Ellipse添加一些FormattedText。我可以通过获取椭圆的RectangleBounds来做。
但是遵循这个例子:
http://msdn.microsoft.com/en-us/library/bb613560.aspx#FormattedText_Object
我需要一个DrawingContext来绘制文本。但如果我不想覆盖onRender,我怎样才能获得DrawingContext?
答案 0 :(得分:4)
您可以使用DrawingGroup
代替。它有Open
方法返回DrawingContext
,您可以使用它来构建图形。
然后,您需要安排该绘图以某种方式出现在UI中。最简单的方法是将其包装在DrawingBrush
中并使用它来绘制UI中的一些现有元素。例如,如果您有一个名为myEllipse
的椭圆,则会根据Fill
将DrawingBrush
属性设置为DrawingGroup
,该FormattedText
包含{ {1}}:
var drawing = new DrawingGroup();
using (var context = drawing.Open())
{
var text = new FormattedText("This is some text",
CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
new Typeface("Calibri"),
30,
Brushes.Green);
context.DrawText(text, new Point(0, 0));
}
var db = new DrawingBrush(drawing);
db.Stretch = Stretch.None;
myEllipse.Fill = db;
如果您已经在Ellipse
填写了其他内容,那么您有两个选择。您可以向此绘图添加更多内容 - 您可以根据需要对上下文进行多次调用。例如,如果我在调用context.DrawText
之前立即添加此内容:
context.DrawRectangle(Brushes.Cyan, null, new Rect(0, 0, 300, 100));
我将在文本后面获得青色背景。 (当然,您需要调整这些示例中的坐标以适合您的布局。)
但是添加一个额外的元素来托管绘图可能更简单,而不是试图将它捎带到一个可以做其他事情的元素中。因此,您可以将Rectangle
元素直接放在Ellipse
上,并使用DrawingBrush
这样的Fill
作为Rectangle
的{{1}}。 Rectangle
实际上看起来不会是矩形的,因为DrawingBrush
不会在整个区域中绘制。因此,效果看起来与将TextBlock
分层放在Ellipse
上时的效果大致相同。