1

我正在使用 VS2012 插入到 Windows 应用商店应用程序的 Common 文件夹中的 RichTextColumns 控件来将 RichTextBlock 中的文本显示到多个列中。文本分为可以用段落、运行和跨度标记的经文。

我需要能够确定用户点击了哪个诗句(或文本部分),以便可以标记诗句(更改背景颜色),并且应用程序可以加载链接到该特定诗句的媒体。

在我们的桌面应用程序中,我们能够从 Run 类继承并插入 VerseIndex 属性。然后我们捕获了 Click 事件并使用 x,y 坐标来查找在该范围内的 Run。在 WinRt 中,Run 类是密封的,因此我们不能从它继承,并且我们用于定位的一些其他调用也丢失了。

可以使用什么方法(除了文本选择,我们需要用户突出显示和剪切/粘贴)来确定点击的诗句并对数据做出反应?

这是我正在使用的 RichTextColumns 显示的示例。

    <ScrollViewer x:Name="ChapterScrollViewer" Margin="0,0,0,40"
                  Style="{StaticResource HorizontalScrollViewerStyle}" Background="White" >
        <StackPanel Orientation="Horizontal" Margin="0,0,20,20" >
            <common:RichTextColumns x:Name="richTextColumnsChapter" VerticalAlignment="Top">
                <common:RichTextColumns.ColumnTemplate>
                    <DataTemplate>
                        <RichTextBlockOverflow Width="400" Margin="50,0,0,0"/>
                    </DataTemplate>
                </common:RichTextColumns.ColumnTemplate>
                <RichTextBlock x:Name="mainRichTextBlockChapter" Margin="0,0,0,0" 
                               IsTextSelectionEnabled="True" 
                               IsTapEnabled="True"
                               FontWeight="Light" Width="400" Foreground="Black" VerticalAlignment="Top" FontSize="20">
                    <Paragraph>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus tempor scelerisque lorem in vehicula. Aliquam tincidunt, lacus ut sagittis tristique, turpis massa volutpat augue, eu rutrum ligula ante a ante Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat</Paragraph>

                </RichTextBlock>
            </common:RichTextColumns>
        </StackPanel>
    </ScrollViewer>
4

1 回答 1

0

正如最常发生的那样,花时间解释您的问题有时会让您重新审视可能的解决方案。这是我想出来的。希望这对其他人有帮助。

即使 Run 类是密封的,Span 类也不是。我添加了我自己的 DocVerse 类,它继承自 Span,其中包含我的 VerseIndex 属性。

在我的视图中,我处理 RichTextColumns 控件上的 Tapped 事件,并使用 GetPosition 我可以确定正确的 Run 是 Tapped。然后,我可以搜索我的 DocVerse 类以查看哪个包含该 Run,并给出我的 Tapped“诗句”。

与 GetPositionFromPoint 调用相关的 RichTextColumns 类存在问题。第一列由 RichTextBlock 表示,而随后的溢出列是 RichTextBlockOverflow 控件。这是找到 Tapped “诗句”并更改 FontWeight 的 Tapped 处理程序。

    private void RichTextColumns_Tapped(object sender, TappedRoutedEventArgs e)
    {
        RichTextColumns control = sender as RichTextColumns;

        Point pTapped = e.GetPosition(e.OriginalSource as UIElement);
        TextPointer tp = null;

        if (e.OriginalSource is RichTextBlock) // tapped in the 1st column
        {
            tp = control.RichTextContent.GetPositionFromPoint(pTapped);
        }
        else if (e.OriginalSource is RichTextBlockOverflow) // tapped in an overflow column
        {
            tp = (e.OriginalSource as RichTextBlockOverflow).GetPositionFromPoint(pTapped);
        }

        if (tp != null)
        {
            // find out which DocVerse (inherits from Span) contains the Run that was tapped
            Run r = tp.Parent as Run;
            foreach (DocVerse v in control.Verses)
            { 
                if (v.Inlines.Contains(r))
                {
                    v.FontWeight = FontWeights.Bold;
                    Debug.WriteLine(v.VerseIndex);
                }
            }
        }
    }
于 2013-06-03T12:32:09.393 回答