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));
我会在文本后面加一个青色背景。(当然,您需要调整这些示例中的坐标以适合您的布局。)
但是,添加一个额外的元素来承载图形可能更简单,而不是试图将其背驮到一个元素中去做其他事情。因此,您可以将一个矩形
元素直接放置在椭圆
上方,并使用画笔
,如填充
来填充该矩形
。矩形
实际上看起来不是矩形的,因为该绘图笔刷
不会在其整个区域内绘制。因此,如果将文本块
分层到椭圆
上,效果将非常相似