0

我有一个带有超链接列的 WPF DataGrid:

<DataGridHyperlinkColumn Binding="{Binding DocName}">
  <DataGridHyperlinkColumn.ElementStyle>`
     <Style>
        <EventSetter Event="Hyperlink.Click" Handler="DocLink_Click" />
     </Style>
  </DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>

该列的内容不是 URL;它是我需要从不同于列显示的 URL 下载的文档的名称。

这一切都很好,除了一件事:在某些情况下,我需要MessageBox在下载之前显示一个。这样做会导致 a System.IO.IOException,它抱怨找不到资源(单击的文档名称)。这个虚拟事件处理程序每​​次都会抛出异常:

private void DocLink_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Crash now!");
}

我能做些什么来防止这种情况发生?

编辑

正如建议的那样,我在一个玩具应用程序中尝试了这个,它在那里工作。经过实验,事实证明只有当事件发生在 navigable Page(不是 a Window)中时才会发生这种情况。所以现在我们有了这个:

应用程序.xaml:

<Application x:Class="WpfApplication1.App"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   StartupUri="NavWin.xaml">
</Application>

NavWin.xaml:

<NavigationWindow x:Class="WpfApplication1.Container"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="NavTest" 
  Source="MainPage.xaml">
</NavigationWindow>

MainPage.xaml:

<Page x:Class="WpfApplication1.MainPage"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:WpfApplication1"
  Title="MainPage" Height="350" Width="525">

  <Grid>
    <DataGrid x:Name="grid" ItemsSource="{Binding Items}" AutoGenerateColumns="False" >
      <DataGrid.Columns>
        <DataGridHyperlinkColumn Binding="{Binding Name}" Header="Name">
           <DataGridHyperlinkColumn.ElementStyle>
              <Style>
                 <EventSetter Event="Hyperlink.Click" Handler="ItemLink_Click" />
              </Style>
           </DataGridHyperlinkColumn.ElementStyle>
        </DataGridHyperlinkColumn>
      </DataGrid.Columns>
    </DataGrid>
  </Grid>
</Page>

MainPage.xaml.cs:

public partial class MainPage : Page
{
  ... 
  private void ItemLink_Click(object sender, RoutedEventArgs e)
  {
     MessageBox.Show("Crash");
  }
}
4

0 回答 0