2012-01-04 8 views
4

私は特定のジオメトリにテキストをクリップする方法を知っていますが、テキストは自動的にクリップに基づいてラップされませんので、以下のような効果を得る方法はありますか?ジオメトリ/パスとして "ダニ"?シェイプの後に/クリップするテキスト?

それぞれの行に適したテキストボックスを手作業で追加し、それに合わせてテキストを分割するかどうかです。これを行うには、私は考えることができる

Example image

答えて

1

唯一の方法は、カスタムコントロールを作成し、OnRenderオーバーライドすることになります。このカスタムコントロールには、クリップ領域を定義するジオメトリと、文字列型の "Text"プロパティがあります。また、int型のlineheightプロパティを持ちます。

OnRenderでは、現在のX、Y位置(クリップジオメトリの左上隅から開始)で描画されるテキストを測定できます。このテキストを1単語ずつ測定し、その単語の境界ボックスがこれは、ジオメトリのHitTest APIを使用して可能であり、単語の境界矩形の4つの点すべてがジオメトリ内にあることをテストします。そうであれば、その単語を描画し、そうでなければXを1文字間隔コントロールの端に達した場合は、Xをゼロにリセットし、Yを1行分増分して、TVがピクセルを描画する方法と同様のスキャンラインを使用して繰り返します。

基本的に何をしようとしていますか独自のWrapPanelまたはTextBlockをテキストラッピングで作成しています。 WrapPanel/TextBlock内のコードを参照するか、テキストラッピングを使用して "カスタムWrapPanel/TextBlock"/"RichTextControlのコーディング"に関する記事を検索するには、WPFフレームワークのReflectorまたはILSpyを使用します。その想像力のあらゆるストレッチでは簡単な作業ではありませんが、上記の方法はあなたに必要なものの裸の骨を与えるでしょう。 http://msdn.microsoft.com/en:私はで使用される技術のいずれかを使用することができればそれは間違いなく私の右方向にいくつかのポインタを与える

敬具、

+0

おかげで、私も思ったんだけど-us/magazine/dd263097.aspxを使用してください。ただし、この場合は特に便利です。 – Siyfion

+0

これは面白そうですね!私は彼がそこでやっていることは、テキストの各文字をパスに配置するためにRenderTransforms(スケール、回転、翻訳)を使用していると思いますか?バニラWPFの機能ではありません。おそらくあなたがこれから取ることができるのは、クリップ領域を定義するパスの座標を取得し、その中にテキストが描画されるようにする方法です。 –

関連する問題