Не работает событие по клику на 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 ссылка.
