如何在 UWP 应用中跨文本块扩展文本选择

How to extend text selection across text blocks in a UWP app

我的应用有一堆段落被放在一起比较。这是使用通用 ItemsRepeater 实现的,它创建与段落一样多的 Grid 元素。每个网格内有一个带有段落编号的 TextBlock 和一个包含该段落的 RichTextBlock。因此层次结构是这样的:

   <ItemsRepeater>
      <Grid>
         <TextBlock />
         <RichTextBlock></RichTextBlock/>
      </Grid>
      <Grid>
         ...
      </Grid>
      <Grid>
         ...
      </Grid>
   </ItemsRepeater>

这导致文本选择如下:

一次只能选择一个RichTextBlock。但是,我想允许 ItemsRepeater 的所有段落的文本选择。这怎么可能?

编辑

我愿意接受其他方法。我试过用项目手动填写 StackPanelRichTextBlock。那不是问题。但是,因为编号的段落需要对齐,我需要能够设置它们的高度以相互匹配。据我所知,只有从 FrameworkElement 派生的元素才具有我需要的 ActualHeightHeight 属性。但是,TextBlockRichTextBlockFrameworkElement也不允许多选,这是我首先要解决的问题。有人 posted a response to a similar question about WPF,但它使用了一个我认为不适用的奇怪解决方案。

所以问题也可以表述为:如何在 TextBlockRichTextBlock 中找到并设置 Run 的高度?使用这个想法,不可能 get/set the run height inside a paragraph. 我不受限于使用 ItemsRepeater,但这也没有产生有用的结果。我正在努力避免为此求助于 HTML/Javascript。

UWP 没有公开足够的 API 供您执行此操作。我在 UWP 上处理过与 RichEditBox 类似的问题,但我没有找到好的解决方案。但如果你真的想要,有两种主要方法可以实现:

  1. 通过嗅探鼠标事件并在控件顶部呈现选择来自己实现选择。极端情况有很多,特别是如果您希望为您正在构建的控件提供适当的可访问性树。
  2. 或者,您可以创建一个 WinRT C++ 项目,您可以在其中访问更多 API,构建一个控件并将其呈现到使用 C#/Xaml 应用程序创建的 canvas 上。

好消息是您不允许人们编辑 (RichTextEdit),它只是视图 (RichTextBlock),因此您不必担心自动更正,IME,Url检测等

编辑:本来我提到了WinRT C++,但我指的是C++/CX。它可能也适用于 WinRT,但我还没有尝试过。