【问题标题】:WPF - DataGridHyperlinkColumn not opening local HTML fileWPF - DataGridHyperlinkColumn 未打开本地 HTML 文件
【发布时间】:2019-12-25 19:40:46
【问题描述】:

环境VS2019 - ver 16.4.2Windows 10 - Pro ver 1903WPF Core 3.1

为什么在我的WPF 应用程序中,以下代码无法从DataGridHyperlinkColumn 中的链接打开文件。根据这个post 它应该打开文件 - 除非我在这里遗漏了什么。

XAML

<Window x:Class="WPF_DataGrid_EFCore.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:WPF_DataGrid_EFCore"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DataGrid x:Name="dgTest" AutoGenerateColumns="False" Margin="0,43,0,0">
            <DataGrid.Columns>
                <DataGridHyperlinkColumn Header="Title" Binding="{Binding Title}">
                    <DataGridHyperlinkColumn.ElementStyle>
                        <Style TargetType="TextBlock">
                            <EventSetter Event="Hyperlink.Click" Handler="dgTest_HyperLink_Click"/>
                        </Style>
                    </DataGridHyperlinkColumn.ElementStyle>
                </DataGridHyperlinkColumn>
            </DataGrid.Columns>
        </DataGrid>
        <Button x:Name="btnTest" Content="Test" HorizontalAlignment="Left" Margin="355,6,0,0" VerticalAlignment="Top" Click="btnTest_Click"/>
    </Grid>
</Window>

MainWindow.Xaml.cs

private void dgTest_HyperLink_Click(object sender, RoutedEventArgs e)
{
    Hyperlink link = (Hyperlink)e.OriginalSource;
    Console.WriteLine(link.NavigateUri.AbsoluteUri); //correctly shows the path as file:///C:/Users/MyUserName/AppData/Local/Temp/TestLocalFile.htm
    System.Diagnostics.Process.Start(link.NavigateUri.AbsoluteUri);
}

备注

  1. 文件在那里,我可以通过将以下链接直接粘贴到 Windows 资源管理器手动打开它:file:///C:/Users/MyUserName/AppData/Local/Temp/TestLocalFile.htm。它在我的默认浏览器 Google Chrome 中打开。
  2. 根据这个post,文件应该打开。

错误

System.ComponentModel.Win32Exception H结果=0x80004005 Message=系统找不到指定的文件。 源 = System.Diagnostics.Process .... .....

【问题讨论】:

    标签: c# wpf .net-core


    【解决方案1】:

    您应该更新代码,该代码将启动每个关注的链接

    private void dgTest_HyperLink_Click(object sender, RoutedEventArgs e)
    {
        Hyperlink link = (Hyperlink)e.OriginalSource;
        Console.WriteLine(link.NavigateUri.AbsoluteUri); //correctly shows the path as file:///C:/Users/MyUserName/AppData/Local/Temp/TestLocalFile.htm
    
        var psi = new ProcessStartInfo
        {
            FileName = link.NavigateUri.AbsoluteUri,
            UseShellExecute = true
        };
        Process.Start(psi);
    }
    

    UseShellExecute 在这里发挥了作用,在 .NET Core 中默认设置为 false,并且

    UseShellExecute 为假时,FileName 属性可以是 可执行文件的完全限定路径,或简单的可执行文件名称 系统将尝试在指定的文件夹中查找 PATH 环境变量。

    在您的情况下,文件名不可执行,因此为了使其正常工作,您必须将 UseShellExecute 设置为 true,这对于 .NET Core 应用程序是正确的。

    附加的答案是 8 岁,使用经典的 .NET,默认情况下此属性为 true。详情也可以参考这个GitHubthread

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 2013-12-05
      • 1970-01-01
      • 2013-10-16
      相关资源
      最近更新 更多