0

ハイパーリンク列を持つ WPF DataGrid があります。

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

列の内容は URL ではありません。列に表示されているものとは異なる URL からダウンロードする必要があるドキュメントの名前です。

1 つのことを除いて、すべて正常に動作します。場合によっては、MessageBoxダウンロードする前に a を表示する必要があります。これを行うSystem.IO.IOExceptionと、リソース (クリックされたドキュメント名) が見つからないというメッセージが表示されます。このダミー イベント ハンドラーは、毎回例外をスローします。

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

これを防ぐにはどうすればよいですか?

編集

提案されたように、おもちゃのアプリでこれを試してみましたが、そこで動作しました。Page実験の結果、イベントが( ではなく)ナビゲート可能で発生した場合にのみ、これが発生することが判明しました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