Как нарисовать FormattedText (если не в методе onRender) - PullRequest
1 голос
/ 02 декабря 2010

Я рисую несколько эллипсов и добавляю их в сетку.

Затем я хотел бы добавить несколько форматированных текстов к каждому эллипсу.Это я мог бы сделать, получив RectangleBounds of Ellipse.

Но следуя этому примеру:

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

Мне нужен DrawingContext для рисования текста.Но если я не хочу переопределять onRender, как я могу получить DrawingContext?

1 Ответ

4 голосов
/ 02 декабря 2010

Вы можете использовать вместо 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...