2012-02-24 5 views
2

FormattedText.BuildGeometryを使用して、マウスの論理位置を決定するために、文字の配置方法を決定しようとしています。私の文脈では、FormattedTextは1行であると見なすことができます。1文字の子ジオメトリを持つ1つの子を持つジオメトリグループを取得する必要があります。これは、文字 "f"と "t"の場合、FormattedTextのテキスト内の文字を繰り返すと、行のジオメトリの数がテキストの文字数よりも少なくなります。FormattedText.BuildGeometry文字を削除する

例コード:

var tf = new Typeface(new FontFamily("Calibri"), FontStyles.Normal, FontWeights.Normal, FontStretches.Normal); 
var ft = new FormattedText("ff", CultureInfo.CurrentCulture, FlowDirection.LeftToRight, tf, 14, Brushes.Black); 
var g = ft.BuildGeometry(new Point(0, 0)); 
var gc = (GeometryGroup)((GeometryGroup)g).Children[0]; 
Debug.Assert(gc.Children.Count == ft.Text.Length, "Expected length of " + ft.Text.Length + " but found " + gc.Children.Count); 

あなただけの空のWPFアプリケーションでボタンにこれを添付することができます。

これは "ff"または "tt"を含むものでは失敗します。フォントを変更すると動作が変わります - これを引き起こす文字が見つかりませんでした。

+1

ここに答えがあります:http://social.msdn.microsoft.com/Forums/eu/wpf/thread/ddd9c850-25a6-4b99-8a43-5816a0d329a1 –

答えて

1

BuildGeometryglyphsではないことをご了承ください。 documentation(強調鉱山)から:

すべてのグリフとテキスト装飾を含むフォーマットされたテキスト、を表すジオメトリオブジェクトを返します。

いくつかのフォントでは、 "ff"と "tt"はligaturesであるため、1つのグリフで表されます。

希望の操作方法については、this questionを参照してください。基本的にBuildHighlightGeometry(Point, int, int)は、個々の文字の境界ボックスを返すことができます。バウンディングボックスを反復処理し、一致する文字が見つかるまでヒットテストを実行できます。