1

我正在处理一些RichTextBlock包含InlineUIContainer元素的对象。我希望能够选择和复制所有文本,包括InlineUIContainer.

目前,当我选择块中的所有文本时,InlineUIContainer会跳过对象中包含的文本。

这是我正在创建的示例:

<RichTextBlock IsTextSelectionEnabled="True">
    <Paragraph FontSize="20">
        <Bold>This text is selectable</Bold>
        <InlineUIContainer FontFamily="Global User Interface">
            <StackPanel Orientation="Horizontal">
                <TextBlock FontSize="11" VerticalAlignment="Top" Margin="0,0,-1,0">Super Script Text</TextBlock>
                <HyperlinkButton ClickMode="Release" Style="{StaticResource NoMarginHyperlinkButtonStyle}">
                    Link
                </HyperlinkButton>
            </StackPanel>
        </InlineUIContainer>
        This text is also selectable
    </Paragraph>
</RichTextBlock>

如果我从这段 Xaml 中选择所有文本并将其复制/粘贴到记事本中,我不会得到超级脚本文本或链接文本。

有没有办法让所有的文本都被选中?

4

1 回答 1

2

这是因为 HyperlinkBut​​ton 不是文档 API 的一部分,实际上是包装在 InlineUIContainer 中的 UIElement。有两种方法可以处理这个问题。

  1. 切换到 Windows 8.1 和继承自 TextElement 的 Hyperlink 并复制将正常工作。
  2. 如果您必须在 Windows 8 中支持此功能,这是一个艰难的方法。删除 RichTextBlock 的默认上下文菜单项并替换为您自己的复制命令。哪个应该得到 2 TextPointers 即 RichtextBlock.SelectionStart 和 RichTextBlock.SelectionEnd

现在使用 WPF,我们可以在此范围内获得 TextRange,但 winRT 不会公开它,因此您需要在代码中执行此操作...获取 RichTextBlock 中的所有块,并遍历每个块以检查它是否为 ContentStart 和 ContentEnd如果在 RTB.SelectionStart 和 RTB.SelectionEnd 内,则将它们添加到列表中。

现在应该很容易从此列表中提取所有运行和粗体/斜体以及托管 HyperlinkBut​​tons 的任何 InlineUIContainers。

2 这不是一个真正的好方法,因为很难在段落等上留出边距等。

于 2013-08-21T15:45:40.910 回答