14

WPFアプリの次のコードは、ハイパーリンクのように見えて動作するハイパーリンクを作成しますが、クリックしても何もません。

クリックするとデフォルトのブラウザが開き、指定されたURLに移動するようにするには、何を変更する必要がありますか?

代替テキストhttp://www.deviantsart.com/upload/4fbnq2.png

XAML:

<Window x:Class="TestLink238492.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel Margin="10">
        <ContentControl x:Name="MainArea"/>
    </StackPanel>
</Window>

コードビハインド:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;

namespace TestLink238492
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            FlowDocumentScrollViewer fdsv = new FlowDocumentScrollViewer();

            FlowDocument doc = new FlowDocument();
            fdsv.Document = doc;
            fdsv.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;
            doc.PagePadding = new Thickness(0);
            Paragraph paragraph = new Paragraph();
            doc.Blocks.Add(paragraph);

            Run run = new Run("this is flow document text and ");
            paragraph.Inlines.Add(run);

            Run run2 = new Run("this is a hyperlink");
            Hyperlink hlink = new Hyperlink(run2);
            hlink.NavigateUri = new Uri("http://www.google.com");
            paragraph.Inlines.Add(hlink);

            StackPanel sp = new StackPanel();
            TextBlock tb = new TextBlock();
            tb.Text = "this is textblock text";
            sp.Children.Add(tb);
            sp.Children.Add(fdsv);

            MainArea.Content = sp;
        }
    }
}
4

2 に答える 2

18

これに対する答えを見つけました。RequestNavigateを追加して自分で処理する必要があります。

Run run2 = new Run("this is a hyperlink");
Hyperlink hlink = new Hyperlink(run2);
hlink.NavigateUri = new Uri("http://www.google.com");
hlink.RequestNavigate += new System.Windows.Navigation.RequestNavigateEventHandler(hlink_RequestNavigate);
paragraph.Inlines.Add(hlink);


void hlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
{
    Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
    e.Handled = true;
}
于 2010-02-18T14:12:40.890 に答える
12

この Poma のソリューションを取得しました。以下のコード セクションは、これを行う必要があるクラスに追加する必要があります。または、複数のファイルから取得する必要がある場合は、どこかの静的クラスに配置できます。私がやっていることのために少し微調整しました。

    #region Activate Hyperlinks in the Rich Text box
    //http://stackoverflow.com/questions/5465667/handle-all-hyperlinks-mouseenter-event-in-a-loaded-loose-flowdocument
    void SubscribeToAllHyperlinks(FlowDocument flowDocument)
    {
        var hyperlinks = GetVisuals(flowDocument).OfType<Hyperlink>();
        foreach (var link in hyperlinks)
            link.RequestNavigate += new System.Windows.Navigation.RequestNavigateEventHandler(link_RequestNavigate);
    }

    public static IEnumerable<DependencyObject> GetVisuals(DependencyObject root)
    {
        foreach (var child in LogicalTreeHelper.GetChildren(root).OfType<DependencyObject>())
        {
            yield return child;
            foreach (var descendants in GetVisuals(child))
                yield return descendants;
        }
    }

    void link_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
    {
        //http://stackoverflow.com/questions/2288999/how-can-i-get-a-flowdocument-hyperlink-to-launch-browser-and-go-to-url-in-a-wpf
        Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
        e.Handled = true;
    }
    #endregion Activate Hyperlinks in the Rich Text box

次のようにコードで呼び出します。

        string xaml = HTMLConverter.HtmlToXamlConverter.ConvertHtmlToXaml(this.itemControl.NotificationItem.Body, true);
        FlowDocument flowDocument = XamlReader.Load(new XmlTextReader(new StringReader(xaml))) as FlowDocument;
        SubscribeToAllHyperlinks(flowDocument);
        bodyFlowDocument.Document = flowDocument;

HTMLConverter に関するものはすべてhttp://blogs.msdn.com/b/wpfsdk/archive/2006/05/25/606317.aspx にあります。これは、HTML をフロー ドキュメントに変換する必要がある場合です。ただし、それはこのトピックの範囲外です。

于 2012-06-08T14:18:55.960 に答える