- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 RichTextBlock 中高亮选中的文本,但是当我在选择文本后单击“btnHighlight”按钮时,高亮的文本与选择不匹配(可能是因为超链接,但如何解决它?)。我哪里错了?
主页.xaml:
<Grid>
<RichTextBlock Name="Rtb" Margin="0,150,0,150" Width="300">
<Paragraph TextIndent="0">
<Hyperlink UnderlineStyle="None" CharacterSpacing="0">
<Run Text="1" FontSize="20" FontWeight="Bold"/>
</Hyperlink>
<Run Text="Text a" FontSize="20"/>
<Hyperlink UnderlineStyle="None">
<Run Text="2" FontSize="20" FontWeight="Bold"/>
</Hyperlink>
<Run Text="Text b" FontSize="20"/>
<Hyperlink UnderlineStyle="None">
<Run Text="3" FontSize="20" FontWeight="Bold"/>
</Hyperlink>
<Run Text="Text c" FontSize="20"/>
<Hyperlink UnderlineStyle="None">
<Run Text="4" FontSize="20" FontWeight="Bold"/>
</Hyperlink>
<Run Text="Text d" FontSize="20"/>
<Hyperlink UnderlineStyle="None">
<Run Text="5" FontSize="20" FontWeight="Bold"/>
</Hyperlink>
<Run Text="Text e" FontSize="20"/>
<Hyperlink UnderlineStyle="None">
<Run Text="6" FontSize="20" FontWeight="Bold"/>
</Hyperlink>
<Run Text="Text f" FontSize="20"/>
<Hyperlink UnderlineStyle="None">
<Run Text="7" FontSize="20" FontWeight="Bold"/>
</Hyperlink>
<Run Text="Text g" FontSize="20"/>
<Hyperlink UnderlineStyle="None">
<Run Text="8" FontSize="20" FontWeight="Bold"/>
</Hyperlink>
<Run Text="Text h" FontSize="20"/>
<Hyperlink UnderlineStyle="None">
<Run Text="9" FontSize="20" FontWeight="Bold"/>
</Hyperlink>
<Run Text="Text i" FontSize="20"/>
<Hyperlink UnderlineStyle="None">
<Run Text="10" FontSize="20" FontWeight="Bold"/>
</Hyperlink>
<Run Text="Text l" FontSize="20"/>
</Paragraph>
</RichTextBlock>
<Button x:Name="btnHighlight" Click="btnHighlight_Click" Content="Highlight" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top"/>
<Button x:Name="btnRemoveHighlight" Click="btnRemoveHighlight_Click" Content="Remove" HorizontalAlignment="Left" Margin="110,10,0,0" VerticalAlignment="Top"/>
</Grid>
MainPage.xaml.cs:
private void btnHighlight_Click(object sender, RoutedEventArgs e)
{
int selectionStart = Rtb.SelectionStart.Offset;
int selectionEnd = Rtb.SelectionEnd.Offset;
int lenght = selectionEnd - selectionStart;
TextRange textRange = new TextRange() { StartIndex = selectionStart, Length = lenght };
TextHighlighter highlighter = new TextHighlighter();
highlighter.Background = new SolidColorBrush(Colors.Yellow);
highlighter.Ranges.Add(textRange);
Rtb.TextHighlighters.Add(highlighter);
}
private void btnRemoveHighlight_Click(object sender, RoutedEventArgs e)
{
Rtb.TextHighlighters.Clear();
}
提前致谢...!
最佳答案
这里的问题是TextPointer指向富文本结构;它不仅仅是字符串纯文本版本的索引。富文本组织如下:RichTextBlock有一个Block的集合,每个Block是一个Paragraph,有一个Inline的集合,每个Inline要么是一个Run(包含文本)要么是一个Span(包含一个Inline的集合)或者LineBreak(代表换行符)或 InlineUIContainer(代表 UI 内容)。
RichTextBlock 也表示为一个序列,该序列是通过此树的顺序遍历获得的。我们为每个元素的开始计算一个偏移量单位(可以认为是一个特殊字符),然后我们计算子元素或文本内容所需的偏移量单位,然后我们为元素的关闭。方便的是,TextPointer 中的“偏移量”是到所选点的偏移量单位数。
下面展示了如何遍历富文本并提取 TextPointer 之前的文本。树中的每个元素都有 ElementStart/ElementEnd 指示其位置,以及 ContentStart/ContentEnd 指示其中内容的位置。位于 TextPointer.Offset 左侧的内容(例如来自 Runs 的文本)包含在字符串中。注意事项:未使用 Linebreak 或 inlineUIContainer 进行测试;不处理从右到左的文本;而且效率不是特别高。
static class DocumentHelper
{
static public string TextUpTo(this InlineCollection inlines, TextPointer pointer)
{
StringBuilder textUpTo = new StringBuilder();
foreach (Inline inline in inlines) {
if (inline.ElementStart.Offset > pointer.Offset) {
break;
}
if (inline is Run run) {
// Need some more work here to take account of run.FlowDirection and pointer.LogicalDirection.
textUpTo.Append(run.Text.Substring(0, Math.Max(0, Math.Min(run.Text.Length, pointer.Offset - run.ContentStart.Offset))));
} else if (inline is Span span) {
string spanTextUpTo = span.Inlines.TextUpTo(pointer);
textUpTo.Append(spanTextUpTo);
} else if (inline is LineBreak lineBreak) {
textUpTo.Append((pointer.Offset >= lineBreak.ContentEnd.Offset) ? Environment.NewLine : "");
} else if (inline is InlineUIContainer uiContainer) {
textUpTo.Append(" "); // empty string replacing the UI content.
} else {
throw new InvalidOperationException($"Unrecognized inline type {inline.GetType().Name}");
}
}
return textUpTo.ToString();
}
static public string TextUpTo( this RichTextBlock rtb, TextPointer pointer)
{
StringBuilder textUpTo = new StringBuilder();
foreach (Block block in rtb.Blocks) {
if (block is Paragraph paragraph) {
textUpTo.Append(paragraph.Inlines.TextUpTo( pointer));
} else {
throw new InvalidOperationException($"Unrecognized block type {block.GetType().Name}");
}
}
return textUpTo.ToString();
}
}
现在……对于原来的问题,我们可以这样做:
private void BtnHighlight_Click(object sender, RoutedEventArgs e)
{
string textUpToStart = this.Rtb.TextUpTo(this.Rtb.SelectionStart);
string textUpToEnd = this.Rtb.TextUpTo(this.Rtb.SelectionEnd);
Debug.WriteLine($"Text up to start: '{textUpToStart}'; text up to end: '{textUpToEnd}'");
TextRange textRange = new TextRange { StartIndex = textUpToStart.Length, Length = (textUpToEnd.Length - textUpToStart.Length) };
TextHighlighter highlighter = new TextHighlighter() { Ranges = { textRange }, Background = new SolidColorBrush(Colors.Yellow) };
this.Rtb.TextHighlighters.Add(highlighter);
}
private void BtnRemoveHighlight_Click(object sender, RoutedEventArgs e)
{
this.Rtb.TextHighlighters.Clear();
}
关于c# - RichTextBlock 选定文本 UWP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51243602/
uwp 和非 uwp 应用程序之间是否可以进行通信。我的非uwp是一个提供服务的后台任务。我想在 uwp 应用程序中调用该非 uwp 服务。 如何调用电话? AppServiceConnection
我正在开发一个应用程序,该应用程序旨在在具有多个显示器(从 1 到 3必要)在每个监视器上,每个监视器都显示不同的 View 。 就我所见,UWP 并不自然适用于这种情况。我设法使用 CoreAppl
我正在尝试对UWP应用使用broadFileSystemAccess功能,但是package.appxmanifest的功能列表中未列出broadFileSystemAccess功能。 我的最低和最高
有时我有一个打开的流或一个事件的队列,必须在应用程序关闭时正确处理。在 WPF 应用程序中,我可以在应用程序上使用 Unloading 事件,但在 UWP 中我注意到这样的事件不存在。 我如何可靠地做
http://wikisend.com/download/880354/UWP_Server.zip 我已将代码上传至上述网址。 它是 UWP 中的客户端和服务器应用程序。这里客户端和服务器都在同一个
大家好 我知道这个问题(Chromium working on UWP)之前(2015/2016)有人问过,想看看有没有更新 我正在尝试在 UWP 应用程序中使用 CEF3 构建,但在运行该应用程序时
我目前正在构建一个应用程序,它可以使用 Windows 游戏 DVR 在某个时刻开始录制屏幕。该录音机在完成录音时将应用程序名称作为文件名。 我发现了如何使用 Applicationview.GetF
我已使用 Desktop App Converter 将我的 WPF 应用程序转换为 appx 包。我需要在资源管理器上下文菜单中有一个项目。 IE。用户右键单击文件并在主菜单中看到我的项目“对应用程
我想稍微修改一个 Button 控件(添加描述)。在哪里可以找到 UWP 控件的默认控件模板? 最佳答案 似乎可以在以下位置找到它们: C:\Program Files (x86)\Windows K
我想通过 UWP 应用访问 windows10 注册表项。 键为:\HKEY_LOCAL_MACHINE\SOFTWARE\MyCompanyName\MyName 我找不到任何函数调用来完成它。 请
我开发了一个 UWP appx,它可以安装在 cmd.exe 提示符中: C:\test>myapp.appx 但是在安装过程中会弹出一个 Windows GUI。 有没有什么方法 使用 Silent
在我的 UWP 应用程序中,如何通过 UpdateTask 中的代码进行调试? VS 2017 中的“生命周期事件”下拉菜单似乎没有提供触发此类后台任务的选项。有办法实现吗? 最佳答案 首先是关于 U
我尝试在 VS 2017 中创建一个 UWP 应用程序包。 创建时我收到一条神秘的错误消息:严重性代码描述项目文件行抑制状态错误 0xdef00532 - 资源“Files/Assets/Square
我有一个 TextBlock在我的应用程序中。我要办理pinch in & out在它上面调整字体的大小。当ManipulationDelta事件触发我检查Scale属性(property),但大多数
为什么默认选择的索引不起作用?它因平台异常而崩溃: RumTime 错误: Exception thrown at 0x00007FFDEF7F7788 (KernelBase.dll) in ab
有没有办法在同一个包中的 UWP 应用程序和桌面桥应用程序之间共享互斥锁?它们似乎有不同的命名空间;使用相同的名称不会在进程之间产生相同的对象。根据 WinObj,UWP 应用程序的对象是,存储在 A
有什么方法可以检测当前的 UWP 要退出 ? (由用户关闭或终止进程) 我想向服务器发送一些关于应用程序将断开连接的请求,还想在退出之前保存一些数据。 最佳答案 无法检测这种情况或阻止用户终止您的应用
我正在使用 XAML 和 C# 开发通用 Windows 平台应用程序。我想在 UWP 中更改焦点上 TextBox 的边框颜色。 在此先感谢您的帮助。 最佳答案 其实实现起来很简单,按照以下步骤即可
是否可以在 UWP 应用中更改甚至隐藏鼠标指针? 我唯一能找到的是: Windows.UI.Xaml.Window.Current.CoreWindow.PointerCursor = null; 但
我是一名优秀的程序员,十分优秀!