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