C# 如何绘制格式化文本(如果不在onRender方法中)

C# 如何绘制格式化文本(如果不在onRender方法中),c#,.net,wpf,C#,.net,Wpf,我画了一些椭圆并将它们添加到网格中 然后我想给每个椭圆添加一些格式化文本。这可以通过得到椭圆的矩形边界来实现 但下面这个例子: 我需要一个DrawingContext来绘制文本。但如果我不想覆盖onRender,如何获取DrawingContext?您可以使用DrawingGroup。它有一个Open方法,该方法返回DrawingContext,您可以使用该方法来构造图形 然后,您需要安排该图形以某种方式显示在UI中。最简单的方法是用DrawingBrush将其包装起来,并使用它在UI中绘制一

我画了一些椭圆并将它们添加到网格中

然后我想给每个椭圆添加一些格式化文本。这可以通过得到椭圆的矩形边界来实现

但下面这个例子:


我需要一个DrawingContext来绘制文本。但如果我不想覆盖onRender,如何获取DrawingContext?

您可以使用
DrawingGroup
。它有一个
Open
方法,该方法返回
DrawingContext
,您可以使用该方法来构造图形

然后,您需要安排该图形以某种方式显示在UI中。最简单的方法是用
DrawingBrush
将其包装起来,并使用它在UI中绘制一些现有元素。例如,如果您有一个名为
myEllipse
的椭圆,这将基于一个
DrawingGroup
FormattedText
,将其
Fill
属性设置为
DrawingBrush

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;
context.DrawRectangle(Brushes.Cyan, null, new Rect(0, 0, 300, 100));
如果您已经用其他东西填充了
椭圆
,则有两种选择。您可以向该图形添加更多内容,也可以在上下文中进行任意数量的调用。例如,如果我在调用
context.DrawText
之前立即添加此项:

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;
context.DrawRectangle(Brushes.Cyan, null, new Rect(0, 0, 300, 100));
我会在文本后面加一个青色背景。(当然,您需要调整这些示例中的坐标以适合您的布局。)


但是,添加一个额外的元素来承载图形可能更简单,而不是试图将其背驮到一个元素中去做其他事情。因此,您可以将一个
矩形
元素直接放置在
椭圆
上方,并使用
画笔
,如
填充
来填充该
矩形
矩形
实际上看起来不是矩形的,因为该
绘图笔刷
不会在其整个区域内绘制。因此,如果将
文本块
分层到
椭圆
上,效果将与使用
绘图组
的效果非常相似。它有一个
Open
方法,该方法返回
DrawingContext
,您可以使用该方法来构造图形

然后,您需要安排该图形以某种方式显示在UI中。最简单的方法是用
DrawingBrush
将其包装起来,并使用它在UI中绘制一些现有元素。例如,如果您有一个名为
myEllipse
的椭圆,这将基于一个
DrawingGroup
FormattedText
,将其
Fill
属性设置为
DrawingBrush

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;
context.DrawRectangle(Brushes.Cyan, null, new Rect(0, 0, 300, 100));
如果您已经用其他东西填充了
椭圆
,则有两种选择。您可以向该图形添加更多内容,也可以在上下文中进行任意数量的调用。例如,如果我在调用
context.DrawText
之前立即添加此项:

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;
context.DrawRectangle(Brushes.Cyan, null, new Rect(0, 0, 300, 100));
我会在文本后面加一个青色背景。(当然,您需要调整这些示例中的坐标以适合您的布局。)

但是,添加一个额外的元素来承载图形可能更简单,而不是试图将其背驮到一个元素中去做其他事情。因此,您可以将一个
矩形
元素直接放置在
椭圆
上方,并使用
画笔
,如
填充
来填充该
矩形
矩形
实际上看起来不是矩形的,因为该
绘图笔刷
不会在其整个区域内绘制。因此,如果将
文本块
分层到
椭圆
上,效果将非常相似