我如何识别哪个文本部分被点击在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>
通常情况下,花时间解释问题有时会让您对可能的解决方案有一个新的认识。这是我发现的。希望这篇文章能帮助到其他人。
尽管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);
}
}
}
}