WPF:超链接事件处理程序中的异常

时间:2012-12-06 16:03:48

标签: c# wpf exception datagrid hyperlink

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

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

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

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

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

我该怎么做才能防止这种情况发生?

修改

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

的App.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");
  }
}

0 个答案:

没有答案