【问题标题】:How to extend text selection across text blocks in a UWP app如何在 UWP 应用中跨文本块扩展文本选择
【发布时间】:2020-04-20 18:26:13
【问题描述】:

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

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

这会导致如下文本选择:

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

编辑

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

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

【问题讨论】:

  • 我认为你做不到。您是否尝试过使用&lt;Run&gt;&lt;/Run&gt;
  • 文本选择只能选择当前文本控件内的内容,不能跨控件选择文本。如果要达到效果,需要把所有的段落放在一个richTextBlock中。您可以尝试使用 Windows.UI.Xaml.Documents 命名空间下的文本类(例如 Run、Paragraph 等)填充 RichTextBlock。
  • @Muzib 我过去做过。唯一的问题是每列中的段落最终会处于不同的高度,而不是齐平。我想我必须测量每个段落的高度并使它们相等。
  • @Faywang-MSFT 不幸的是,“‘ItemsRepeater’类型的值不能添加到‘BlockCollection’类型的集合或字典中。”
  • 整件事令人沮丧,因为 UWP 忽略了从 @ 派生 RunSpanLineBreak 或任何其他可以进入 TextBlockRichTextBlock 的相关元素987654350@,表示找不到ActualHeight,也无法设置Height。但是,不能随意选择多个TextBlocks或RichTextBlocks。

标签: c# xaml gridview uwp paragraph


【解决方案1】:

UWP 没有为您提供足够的 API 来执行此操作。我在 UWP 上使用 RichEditBox 解决了类似的问题,但我没有找到好的解决方案。但如果你真的想要,有两种主要方法可以实现:

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

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

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

【讨论】:

  • 在 RT 中构建控件并在应用中呈现的文档在哪里?
  • 您可以了解如何创建 C++/WinRT 控件here
猜你喜欢
  • 1970-01-01
  • 2017-04-06
  • 2023-02-14
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 2012-02-15
相关资源
最近更新 更多