如何在 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
的所有段落的文本选择。这怎么可能?
编辑
我愿意接受其他方法。我试过用项目手动填写 StackPanel
或 RichTextBlock
。那不是问题。但是,因为编号的段落需要对齐,我需要能够设置它们的高度以相互匹配。据我所知,只有从 FrameworkElement
派生的元素才具有我需要的 ActualHeight
和 Height
属性。但是,TextBlock
和RichTextBlock
等FrameworkElement
也不允许多选,这是我首先要解决的问题。有人 posted a response to a similar question about WPF,但它使用了一个我认为不适用的奇怪解决方案。
所以问题也可以表述为:如何在 TextBlock
或 RichTextBlock
中找到并设置 Run
的高度?使用这个想法,不可能 get/set the run height inside a paragraph. 我不受限于使用 ItemsRepeater
,但这也没有产生有用的结果。我正在努力避免为此求助于 HTML/Javascript。
UWP 没有公开足够的 API 供您执行此操作。我在 UWP 上处理过与 RichEditBox 类似的问题,但我没有找到好的解决方案。但如果你真的想要,有两种主要方法可以实现:
- 通过嗅探鼠标事件并在控件顶部呈现选择来自己实现选择。极端情况有很多,特别是如果您希望为您正在构建的控件提供适当的可访问性树。
- 或者,您可以创建一个 WinRT C++ 项目,您可以在其中访问更多 API,构建一个控件并将其呈现到使用 C#/Xaml 应用程序创建的 canvas 上。
好消息是您不允许人们编辑 (RichTextEdit),它只是视图 (RichTextBlock),因此您不必担心自动更正,IME,Url检测等
编辑:本来我提到了WinRT C++,但我指的是C++/CX。它可能也适用于 WinRT,但我还没有尝试过。
我的应用有一堆段落被放在一起比较。这是使用通用 ItemsRepeater
实现的,它创建与段落一样多的 Grid
元素。每个网格内有一个带有段落编号的 TextBlock
和一个包含该段落的 RichTextBlock
。因此层次结构是这样的:
<ItemsRepeater>
<Grid>
<TextBlock />
<RichTextBlock></RichTextBlock/>
</Grid>
<Grid>
...
</Grid>
<Grid>
...
</Grid>
</ItemsRepeater>
这导致文本选择如下:
一次只能选择一个RichTextBlock
。但是,我想允许 ItemsRepeater
的所有段落的文本选择。这怎么可能?
编辑
我愿意接受其他方法。我试过用项目手动填写 StackPanel
或 RichTextBlock
。那不是问题。但是,因为编号的段落需要对齐,我需要能够设置它们的高度以相互匹配。据我所知,只有从 FrameworkElement
派生的元素才具有我需要的 ActualHeight
和 Height
属性。但是,TextBlock
和RichTextBlock
等FrameworkElement
也不允许多选,这是我首先要解决的问题。有人 posted a response to a similar question about WPF,但它使用了一个我认为不适用的奇怪解决方案。
所以问题也可以表述为:如何在 TextBlock
或 RichTextBlock
中找到并设置 Run
的高度?使用这个想法,不可能 get/set the run height inside a paragraph. 我不受限于使用 ItemsRepeater
,但这也没有产生有用的结果。我正在努力避免为此求助于 HTML/Javascript。
UWP 没有公开足够的 API 供您执行此操作。我在 UWP 上处理过与 RichEditBox 类似的问题,但我没有找到好的解决方案。但如果你真的想要,有两种主要方法可以实现:
- 通过嗅探鼠标事件并在控件顶部呈现选择来自己实现选择。极端情况有很多,特别是如果您希望为您正在构建的控件提供适当的可访问性树。
- 或者,您可以创建一个 WinRT C++ 项目,您可以在其中访问更多 API,构建一个控件并将其呈现到使用 C#/Xaml 应用程序创建的 canvas 上。
好消息是您不允许人们编辑 (RichTextEdit),它只是视图 (RichTextBlock),因此您不必担心自动更正,IME,Url检测等
编辑:本来我提到了WinRT C++,但我指的是C++/CX。它可能也适用于 WinRT,但我还没有尝试过。