我有一个带有超链接列的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");
}
}