2017-11-30 21 views
0

많은 전자 책 독자와 마찬가지로 단락 기반 상호 작용의 행을 따라 무언가를하려고합니다. 단락을 클릭하고 작은 메뉴를 표시 할 수 있습니다. 몇 가지 옵션 등).RichTextBlock에서 'DoubleTapped'이벤트를 사용하여 탭된 단락 결정

내가 붙어있는 건 사용자가 클릭하거나 탭 한 단락을 결정하는 것입니다. 이벤트는 Block 유형의 개체에 직접 할당 할 수 없으므로 DoubleTapped 이벤트 처리기를 부모 인 RichTetBlock에 연결하여 해결하려고했습니다. 나는 위치에 기반하여 단락을 결정하는 것이 어떻게 든 가능할 수도 있다고 생각하고 있었지만 실제로 어떻게 움직이는 지 정확히 알지 못했다. 내가 지금까지있어 무엇

:

this.chapterText.AddHandler(DoubleTappedEvent, new DoubleTappedEventHandler(chapterText_DoubleTapped), true); 
... 
private void chapterText_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e) 
{ 
    var rtb = sender as RichTextBlock; 
    var y = e.GetPosition(rtb).Y; 
    var paragraph = rtb.Blocks.FirstOrDefault(o => y >= o.) as Paragraph; 
} 

그러나이 방법을 명확하게 작동하지 않습니다.

여기에 누락 된 것이 있습니까?

감사합니다. 내가 지금까지있어 무엇

답변

0

...

당신은 거의 다 :

private void RichTextBlock_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e) 
    { 
     RichTextBlock richTextBlock = sender as RichTextBlock; 
     TextPointer textPointer = richTextBlock.GetPositionFromPoint(e.GetPosition(richTextBlock)); 
     Paragraph paragraph = richTextBlock.Blocks.Where(b => b.ContentStart.Offset <= textPointer.Offset && b.ContentEnd.Offset >= textPointer.Offset).FirstOrDefault() as Paragraph; 
    } 

또는

그런데
private void RichTextBlock_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e) 
    { 
     RichTextBlock richTextBlock = sender as RichTextBlock; 
     TextPointer textPointer = richTextBlock.GetPositionFromPoint(e.GetPosition(richTextBlock)); 
     Run run = textPointer.Parent as Run; 
     Paragraph paragraph = run.ElementStart.Parent as Paragraph; 
    } 

, 사용자가 설정 한 경우 IsTextSelectionEnabled 속성이 RichTextBlock ~ false 인 경우 수동으로 등록하지 않아도됩니다. 코드 뒤에있는 DoubleTapped 이벤트 핸들러는 XAML에 등록한 후에 작동합니다.

<RichTextBlock IsTextSelectionEnabled="False" DoubleTapped="RichTextBlock_DoubleTapped">