我已经尝试将隐藏的webbrowser的内容复制到RichTextBox,这要归功于 Stack Overflow 中已经发布的问题,这是我的代码
<WebBrowser Name="webBrowser1" helper:WebBrowserHelper.BindableSource="C:\Users\med\Desktop\cover.xhtml" Visibility="Hidden"/>
<RichTextBox IsReadOnly="True" Name="richTextBox1" />
这是我的代码背后:
private void Button_Click_1(object sender, RoutedEventArgs e)
{
dynamic document = webBrowser1.Document;
document.ExecCommand("SelectAll", false, null);
document.ExecCommand("Copy", false, null);
richTextBox1.Paste();
}
这里的问题是当我的RichTextBox控件中显示Html页面时,我无法点击链接移动到另一个页面,也不会显示图像... 有什么建议吗?
这种操作的主要目的是能够选择我的html内容,因为在网络浏览器中,我无法启用它并捕捉所选文本的开始和结束位置,这对于在Html上进行突出显示是必要的文本(来自Epub文件)[如果我使用textrange
并且用户选择一个单词并突出显示它,如果该单词在此html文件中存在重复,则该单词将突出显示N次,但我想仅突出显示选定的部分)。
有没有可能的替代方案?
答案 0 :(得分:3)
要启用用户与RichTextBox
中超链接的互动,您需要将RichTextBox.IsDocumentEnabled
属性设置为true
。用户现在可以通过Ctrl + Click跟踪链接:
<RichTextBox IsDocumentEnabled="True" />
如果您将控件标记为只读,则只需点击一下即可:
<RichTextBox IsDocumentEnabled="True" IsReadOnly="True" />
完成此操作后,当用户单击超链接时,仍然需要实际提供回调。 RichTextBox
中的超链接包含在Hyperlink
类的实例中。这个类有一个RequestNavigate
事件,可以满足您的需求。您可以在每个Hyperlink
上单独设置每个事件,但在包含RichTextBox
的情况下设置它会更加容易,并允许路由事件机制冒泡RequestNavigate
到文本框。
您可以在窗口OnLoaded
的代码中执行此操作:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
richTextBox1.AddHandler(Hyperlink.RequestNavigateEvent, new RequestNavigateEventHandler(HyperLink_RequestNavigate));
}
void HyperLink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
{
Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
e.Handled = true;
}
或者,您可以使用Hyperlink
对象的默认样式并提供回调来在富文本框的XAML中执行此操作:
<RichTextBox Name="richTextBox1" AcceptsTab="True" IsDocumentEnabled="True">
<RichTextBox.Resources>
<Style TargetType="Hyperlink">
<EventSetter Event="RequestNavigate" Handler="HyperLink_RequestNavigate" />
</Style>
</RichTextBox.Resources>
</RichTextBox>
(注意 - 在Windows 7中测试过)。
就显示图像而言,这只是开箱即用的RichTextBox
。如果我创建包含某些图像的Microsoft Word文档,然后将整个文档的内容复制并粘贴到RTB中,则会显示包含的图像。如果我通过右键单击图像并选择&#34;复制图像&#34;来复制单个图像,然后将其粘贴到RTB中,它就会显示出来。但是,从Word复制并粘贴到RTB会使用RTF作为其interchange format;也许你的HTML转换器存在一些问题?
顺便说一句,确切地理解给定FlowDocument
内的对象是不是很容易理解。可能内部的结构没有很好地记录(参见here的概述)。我发现以下调试实用程序很有用,它们将FlowDocument
转换为XAML并以可读格式输出:
public static class FlowDocumentHelper
{
public static string ToFormattedXamlString(this FlowDocument doc)
{
if (doc == null)
return null;
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = " ";
var sb = new StringBuilder();
var xmlWriter = XmlWriter.Create(sb, settings);
XamlWriter.Save(doc, xmlWriter);
return sb.ToString();
}
public static string DebugFlowDocumentXaml(this FlowDocument doc)
{
var str = doc.ToFormattedXamlString();
Debug.WriteLine(str);
return str;
}
}