С# Гиперссылка в TextBlock: ничего не происходит, когда я нажимаю на нее

В моем автономном приложении C# я хочу, чтобы пользователи щелкали ссылку, которая запускала бы их любимый браузер.

System.Windows.Controls.TextBlock text = new TextBlock();
Run run = new Run("Link Text");

Hyperlink link = new Hyperlink(run);
link.NavigateUri = new Uri("http://w3.org");
text.Inlines.Add(link);

Ссылка отображается корректно.

Когда я навожу на него мышь, ссылка становится красной.

ПРОБЛЕМА: Когда я нажимаю на нее, ничего не происходит.

Я что-то забыл? Нужно ли мне реализовать какой-то метод, чтобы действительно открыть ссылку?


person Nicolas Raoul    schedule 05.10.2012    source источник


Ответы (4)


Вам нужно обработать событие RequestNavigate гиперссылки. Вот быстрый способ сделать это:

link.RequestNavigate += (sender, e) =>
{
    System.Diagnostics.Process.Start(e.Uri.ToString());
};
person markmuetz    schedule 05.10.2012

Вы обрабатываете событие Hyperlink.RequestNavigate? Когда пользователь щелкает гиперссылку в окне WPF, он не открывает автоматически браузер с URI, указанным в его свойстве NavigateUri.

В вашем коде вы можете сделать что-то вроде:

link.RequestNavigate += LinkOnRequestNavigate;

private void LinkOnRequestNavigate(object sender, RequestNavigateEventArgs e)
{
    System.Diagnostics.Process.Start(e.Uri.ToString());
}
person Simon Brydon    schedule 05.10.2012
comment
Гиперссылка WPF почти бесполезна. Я хочу, чтобы он запускал URL-адрес, используя URL-адрес, указанный в xaml, иначе почему бы мне просто не использовать метку и кнопку с моей моделью представления. - person Gary Kindel; 22.01.2019


Вы можете создать глобальный обработчик гиперссылок в своем App.xaml.cs.

protected override void OnStartup(StartupEventArgs e) {
    EventManager.RegisterClassHandler(
        typeof(System.Windows.Documents.Hyperlink),
        System.Windows.Documents.Hyperlink.RequestNavigateEvent,
        new System.Windows.Navigation.RequestNavigateEventHandler(
            (sender, en) => System.Diagnostics.Process.Start(en.Uri.ToString())
        )
    );
    base.OnStartup(e);
}

Это предполагает, что все свойства NavigateUri относятся к чему-то, что вы хотите запустить, но вы всегда можете заставить обработчик позаботиться о крайних случаях.

person Patrick    schedule 04.03.2021