如何绘制FormattedText(如果没有在onRender方法中)

时间:2010-12-02 01:01:32

标签: c# .net wpf

我绘制一些椭圆并将它们添加到网格中。

然后我想为每个Ellipse添加一些FormattedText。我可以通过获取椭圆的RectangleBounds来做。

但是遵循这个例子:

http://msdn.microsoft.com/en-us/library/bb613560.aspx#FormattedText_Object

我需要一个DrawingContext来绘制文本。但如果我不想覆盖onRender,我怎样才能获得DrawingContext?

1 个答案:

答案 0 :(得分:4)

您可以使用DrawingGroup代替。它有Open方法返回DrawingContext,您可以使用它来构建图形。

然后,您需要安排该绘图以某种方式出现在UI中。最简单的方法是将其包装在DrawingBrush中并使用它来绘制UI中的一些现有元素。例如,如果您有一个名为myEllipse的椭圆,则会根据FillDrawingBrush属性设置为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上时的效果大致相同。