2012-02-24 3 views
2

FormattedText.BuildGeometry를 사용하여 문자 배치 방법을 결정하여 마우스의 논리 위치를 결정하려고합니다. 필자의 맥락에서 FormattedText는 한 줄로 가정 할 수 있습니다. 각 문자에 대해 하위 지오메트리가있는 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

짧은 대답은 BuildGeometry이 (가) glyphs에 있다고 생각합니다. documentation (강조 광산)에서 :

모든 글리프 및 텍스트 장식을 포함하여 서식있는 텍스트, 를 나타내는 기하학 오브젝트를 돌려줍니다.

여러 글꼴에서 "ff"및 "tt"는 ligatures이므로 하나의 글리프로 표시됩니다.

원하는 것을 수행하는 방법에 대한 설명은 this question을 참조하십시오. 기본적으로 BuildHighlightGeometry(Point, int, int)은 개별 문자의 경계 상자를 반환 할 수 있습니다. 경계 상자를 반복하고 일치하는 문자를 찾을 때까지 적중 테스트를 수행 할 수 있습니다.

관련 문제