如何在RichTextBox(WPF)中启用图像和链接?

时间:2014-08-19 09:28:57

标签: c# wpf browser richtextbox

我已经尝试将隐藏的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次,但我想仅突出显示选定的部分)。 有没有可能的替代方案?

1 个答案:

答案 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;
    }
}