Не работает событие по клику на hyperlink wpf c#

Не срабатывает ивент по клику. Никак не могу понять, в чём дело. Использую для вывода TextBlock. Вот код:

private void InfoBlockSetup()
{
    RegistryKey gameRegistryKey = Registry.LocalMachine.OpenSubKey(@SKYRIM_SUB_KEY);
    var installedPath = gameRegistryKey.GetValue(SKYRIM_REGISTRY_KEY_INSTALLED_PATH);

    Hyperlink hlink = new Hyperlink(new Run(installedPath.ToString()));

    hlink.Click += new RoutedEventHandler(OpenGameFolder);
    hlink.Foreground = System.Windows.Media.Brushes.White;

    InfoBar.Inlines.Add(hlink);
}

private void OpenGameFolder(object sender, EventArgs e)
{
    RegistryKey gameRegistryKey = Registry.LocalMachine.OpenSubKey(@SKYRIM_SUB_KEY);
    var installedPath = gameRegistryKey.GetValue(SKYRIM_REGISTRY_KEY_INSTALLED_PATH);

    Process.Start(installedPath.ToString());
}

Ответы (1 шт):

Автор решения: aepot

Можно то же самое в XAML сделать, у меня сработало.

сможете показать как?

Легко

<TextBlock>
    <Run>Нажми на</Run>
    <Hyperlink Click="Hyperlink_Click">cсылку</Hyperlink>
</TextBlock>
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
    string path = @"C:\";
    Process process = new Process()
    { 
        StartInfo = new ProcessStartInfo
        { 
            FileName = path,
            UseShellExecute = true
        }
    };
    process.Start();
}

Выглядит это так

введите сюда описание изображения


С привязкой данных

<TextBlock>
    <Hyperlink Click="Hyperlink_Click">
        <Run Text="{Binding Path}"/>
    </Hyperlink>
</TextBlock>
public sealed partial class MainWindow : Window, INotifyPropertyChanged
{
    private string _path = "здесь будет ссылка";

    public string Path
    {
        get => _path;
        set
        {
            _path = value;
            OnPropertyChanged();
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    private void InfoBlockSetup()
    {
        using RegistryKey gameRegistryKey = Registry.LocalMachine.OpenSubKey(@SKYRIM_SUB_KEY);
        Path = gameRegistryKey.GetValue(SKYRIM_REGISTRY_KEY_INSTALLED_PATH).ToString();
    }

    private void Hyperlink_Click(object sender, RoutedEventArgs e)
    {
        Process process = new Process()
        { 
            StartInfo = new ProcessStartInfo
            { 
                FileName = Path,
                UseShellExecute = true
            }
        };
        process.Start();
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

Учтите только, что у вас таким образом появляется дыра в безопасности приложения. Прописав то что мне нужно в реестр, я могу от имени вашего приложения запустить что угодно. Особенно это критично, если ваше приложение работает с правами администратора в системе. Поэтому я бы на вашем месте еще бы проверял валидность ключа реестра, что там действительно путь к каталогу, а не файлу, и не HTTP ссылка.

→ Ссылка