我正在使用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>
答案 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);
}
}
}
}