2010-12-02 30 views
1

楕円をいくつか描いてグリッドに追加します。FormattedTextを描画する方法(onRenderメソッドにない場合)

次に、各楕円にFormattedTextを追加したいと思います。これは楕円のRectangleBoundsを取得することで可能です。

しかし、この例では、以下:

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

私はテキストを描画するDrawingContextではを必要としています。しかし、私がonRenderをオーバーライドしたくない場合は、どうすればDrawingContextを取得できますか?

答えて

4

代わりにDrawingGroupを使用できます。それはDrawingContextを返すOpenメソッドを持ち、それを使って図面を構築することができます。

次に、その図面が何らかの形でUIに表示されるように調整する必要があります。最も簡単な方法は、DrawingBrushにラップし、それを使用してUIの既存の要素をペイントすることです。あなたはmyEllipseと呼ばれる楕円を持っている場合たとえば、これは含まれていDrawingGroupに基づいDrawingBrushするそのFillプロパティを設定します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を満たしている場合何か他のものと、2つの選択肢があります。この図面にコンテンツを追加することもできます。コンテキストには、好きなだけ多くの呼び出しを行うことができます。例えば、私はすぐにcontext.DrawTextへの呼び出し前にこれを追加した場合:

context.DrawRectangle(Brushes.Cyan, null, new Rect(0, 0, 300, 100)); 

は、私は、テキストの背後にあるシアンの背景を取得します。 (あなたのレイアウトに合わせて、これらの例の座標を調整する必要があります。)

しかし、要素にピギーバックするのではなく、図面をホストする余分な要素を追加する方が簡単かもしれませんそれは他に何かをするためのものです。だからRectangle要素をEllipseのすぐ上に配置し、(これはのようにこれを使用します)をRectangleとして使用します。 Rectangleは、実際には長方形に見えません。これは、このDrawingBrushがその全領域にペイントしないためです。したがって、効果は、をEllipseに重ねた場合と同じように見えます。

関連する問題