Вы можете использовать вместо DrawingGroup
. У него есть метод Open
, который возвращает DrawingContext
, и вы можете использовать его для построения чертежа.
Затем вам нужно будет сделать так, чтобы этот чертеж каким-то образом отображался в пользовательском интерфейсе. Самый простой способ - обернуть его в DrawingBrush
и использовать его для рисования какого-либо существующего элемента в пользовательском интерфейсе. Например, если у вас есть эллипс с именем myEllipse
, для его свойства Fill
будет установлено значение DrawingBrush
на основе DrawingGroup
, содержащего один бит FormattedText
:
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
. Rectangle
на самом деле не будет выглядеть прямоугольным, потому что DrawingBrush
не рисует во всей своей области. Таким образом, эффект будет выглядеть примерно так же, как если бы вы наложили TextBlock
на Ellipse
.