В этот вопрос (и принятый ответ) простая программа WPF устанавливает обработчик PreviewKeyDown
для вызова Process.Start
для имени каталога, чтобы открыть эту папку в проводнике Windows.
Если я изменю определение обработчика, чтобы открыть URL-адрес следующим образом:
data_grid.PreviewKeyDown += (s, e) =>
{
if (e.Key == Key.O && data_grid.SelectedItem is DirectoryInfo info)
System.Diagnostics.Process.Start("https://www.github.com");
};
открывает две вкладки браузера, когда я нажимаю клавишу o
.
В исходной версии не открылись два Проводника Windows.
Почему версия URL открывает два окна браузера? Какой хороший способ заставить его открыть только один?
Чтобы сделать это более конкретным и ясным, вот целая программа, которая демонстрирует проблему.
MainWindow.xaml
<Window x:Class="WpfUrlsDataGrid.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfUrlsDataGrid"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
</Grid>
</Window>
MainWindow.xaml.cs
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace WpfUrlsDataGrid
{
public class Address { public string Url { get; set; } }
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var data_grid = new DataGrid()
{
IsReadOnly = true,
AutoGenerateColumns = true,
ItemsSource = new[]
{
new Address() { Url = "https://www.google.com" },
new Address() { Url = "https://www.github.com" },
new Address() { Url = "https://www.stackoverflow.com" }
}
};
data_grid.PreviewKeyDown += (s, e) =>
{
if (e.Key == Key.O && data_grid.SelectedItem is Address address)
System.Diagnostics.Process.Start(address.Url);
};
var dock_panel = new DockPanel();
dock_panel.Children.Add(data_grid);
Content = dock_panel;
}
}
}
Вот как выглядит пример программы:
![enter image description here](https://i.stack.imgur.com/HfZQU.png)
ОБНОВЛЕНИЕ в ответ на комментарии ниже
Если я добавлю точку останова в следующую строку:
System.Diagnostics.Process.Start(address.Url);
Открывается только одна вкладка браузера! Очень странно, что при отладке поведение отличается.
ОБНОВЛЕНИЕ в ответ на комментарии ниже
Если я изменю браузер, используемый для Microsoft Edge, следующим образом:
System.Diagnostics.Process.Start(String.Format("microsoft-edge:{0}", address.Url));
он по-прежнему открывает две вкладки.
UPDATE
Проблема, кажется, прерывистая. В большинстве случаев времени открывается две вкладки браузера. Однако иногда он открывает только одну вкладку.