Пример использования гиперссылки в WPF
Я видел несколько предложений, которые вы можете добавить гиперссылку на приложение WPF через управление Hyperlink
.
Вот как я пытаюсь использовать его в своем коде:
Click here
Я получаю следующую ошибку:
- Откройте внешние ссылки в браузере с веб-браузером Android
- Как сделать кнопку похожим на ссылку?
- Изменить цвет текста в тексте TextView и щелкнуть?
- Как добавить гиперссылку в JLabel
- html ссылки не работают (с использованием base href)
Свойство «Текст» не поддерживает значения типа «Гиперссылка».
Что я делаю не так?
- Связывание значения столбца в jqGrid с новой страницей с помощью GET
- Найти имя пакета для приложений Android, чтобы использовать Intent для запуска приложения Market из Интернета
- Удалить упорное подчеркивание ссылки
- Как сохранить: активный стиль css после нажатия элемента
- Как создать ссылки в текстовом клиенте?
- Scrapy: Следуйте ссылке, чтобы получить дополнительные данные элемента?
- C # regex pattern для извлечения URL-адресов из заданной строки - не полный URL-адрес html, но также и ссылки
- Что такое синтаксис RTF для гиперссылки?
Если вы хотите, чтобы ваше приложение открыло ссылку в веб-браузере, вам нужно добавить HyperLink с событием RequestNavigate, установленным на функцию, которая программным образом открывает веб-браузер с адресом в качестве параметра.
Click here
В коде нужно добавить что-то подобное этому для обработки события RequestNavigate.
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) { Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri)); e.Handled = true; }
Кроме того, вам также понадобится следующий импорт.
using System.Diagnostics; using System.Windows.Navigation;
Это будет выглядеть в вашем приложении.
В дополнение к ответу Fuji мы можем сделать обработчик повторно используемым, превратив его в прикрепленное свойство:
public static class HyperlinkExtensions { public static bool GetIsExternal(DependencyObject obj) { return (bool)obj.GetValue(IsExternalProperty); } public static void SetIsExternal(DependencyObject obj, bool value) { obj.SetValue(IsExternalProperty, value); } public static readonly DependencyProperty IsExternalProperty = DependencyProperty.RegisterAttached("IsExternal", typeof(bool), typeof(HyperlinkExtensions), new UIPropertyMetadata(false, OnIsExternalChanged)); private static void OnIsExternalChanged(object sender, DependencyPropertyChangedEventArgs args) { var hyperlink = sender as Hyperlink; if ((bool)args.NewValue) hyperlink.RequestNavigate += Hyperlink_RequestNavigate; else hyperlink.RequestNavigate -= Hyperlink_RequestNavigate; } private static void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e) { Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri)); e.Handled = true; } }
И используйте его вот так:
Click here
Hyperlink
не является элементом управления, это элемент содержимого streamа , его можно использовать только в элементах управления, которые поддерживают stream streamа, например TextBlock
. TextBoxes
имеет только обычный текст.
Если вы хотите локализовать строку позже, то этих ответов недостаточно, я бы предложил что-то вроде:
IMHO самым простым способом является использование нового Hyperlink
управления, унаследованного от Hyperlink
:
/// /// Opens in a default system browser /// public class ExternalBrowserHyperlink : Hyperlink { public ExternalBrowserHyperlink() { RequestNavigate += OnRequestNavigate; } private void OnRequestNavigate(object sender, RequestNavigateEventArgs e) { Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri)); e.Handled = true; } }
Также обратите внимание, что Hyperlink
не должна использоваться для навигации. Вы можете подключить его к команде.
Например:
Clear
Мне понравилась идея Артура о многократном обработчике, но я думаю, что есть более простой способ сделать это:
private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) { if (sender.GetType() != typeof (Hyperlink)) return; string link = ((Hyperlink) sender).NavigateUri.ToString(); Process.Start(link); }
Очевидно, что могут возникнуть угрозы безопасности при запуске любого процесса, поэтому будьте осторожны.
Надеюсь, что это тоже поможет кому-то.
using System.Diagnostics; using System.Windows.Documents; namespace Helpers.Controls { public class HyperlinkEx : Hyperlink { protected override void OnClick() { base.OnClick(); Process p = new Process() { StartInfo = new ProcessStartInfo() { FileName = this.NavigateUri.AbsoluteUri } }; p.Start(); } } }