【发布时间】:2023-03-14 17:53:02
【问题描述】:
在 this question(和接受的答案)中,一个简单的 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 键时,它会打开两个浏览器标签。
原始版本没有打开两个文件资源管理器窗口。
为什么 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;
}
}
}
示例程序如下所示:
UPDATE响应下面的cmets
如果我在以下行添加断点:
System.Diagnostics.Process.Start(address.Url);
只打开一个浏览器选项卡!很奇怪,调试时的行为不一样。
UPDATE响应下面的cmets
如果我将使用的浏览器更改为 Microsoft Edge,如下所示:
System.Diagnostics.Process.Start(String.Format("microsoft-edge:{0}", address.Url));
它仍然会打开两个标签。
更新
问题似乎是间歇性的。 大多数情况下,它会打开两个浏览器标签。但是,有时它只会打开一个标签。
【问题讨论】:
-
使用调试器,通过在此处设置断点来查看您的函数是否被调用了两次
-
还要检查当您将标准浏览器更改为其他浏览器时是否会发生这种变化,以确保它不是试图打开起始页或类似内容的浏览器
-
嗨@DenisSchaf!谢谢参观。为了响应您的 cmets,我已对问题添加了一些更新。
-
尝试使用
KeyDown事件而不是PreviewKeyDown
标签: c# wpf process.start