我如何识别哪个文本部分被点击在Windows商店应用程序

本文关键字:Windows 应用程序 文本部 何识别 识别 | 更新日期: 2023-09-27 18:16:14

我使用的是RichTextColumns控件,VS2012插入到Windows商店应用程序的公共文件夹中,以显示从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>

我如何识别哪个文本部分被点击在Windows商店应用程序

通常情况下,花时间解释问题有时会让您对可能的解决方案有一个新的认识。这是我发现的。希望这篇文章能帮助到其他人。

尽管Run类是密封的,但是Span类不是。我添加了我自己的DocVerse类继承自Span包含我的VerseIndex属性。

在我的视图中,我处理RichTextColumns控件上的tap事件,并使用GetPosition我可以确定被tap的正确运行。然后我可以搜索我的DocVerse类,看看哪一个包含Run,给我我的"verse"。

与GetPositionFromPoint调用相关的RichTextColumns类存在问题。第一列由RichTextBlock表示,而下面的溢出列是RichTextBlockOverflow控件。下面是查找被选中的"诗句"并更改字体重量的被选中的处理程序。

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