如何识别在Windows应用商店应用中使用哪个文本部分

时间:2013-05-31 19:15:52

标签: c# windows-store-apps richtext

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

我需要能够确定用户点击的Verse(或文本部分),以便可以标记Verse(更改背景颜色),并且app可以加载链接到该特定经文的媒体。

在我们的桌面应用程序中,我们能够从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>

1 个答案:

答案 0 :(得分:0)

最常见的情况是,花时间解释您的问题有时会让您重新审视可能的解决方案。这是我想出来的。希望这会对其他人有所帮助。

即使Run类已被密封,但Span类也没有。我添加了自己的继承自Span的DocVerse类,其中包含我的VerseIndex属性。

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

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

    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);
                }
            }
        }
    }