返回NavigationWindow后出现NullPointerException

本文关键字:NullPointerException NavigationWindow 返回 | 更新日期: 2023-09-27 18:30:01

这是我的导航窗口

<NavigationWindow x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="800" Width="600" Source="Page1.xaml">

这是我的第一页

<Page x:Class="WpfApplication1.Page1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  mc:Ignorable="d" 
  d:DesignHeight="600" d:DesignWidth="800"
Title="Page1" Name="IndexPage">
<ListView Name="myListView" ItemsSource="{Binding ElementName=IndexPage, Path=SeriesCollection}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" IsSynchronizedWithCurrentItem="True" SelectionChanged="handleSelected">
    <ListView.ItemsPanel >
        <ItemsPanelTemplate>
            <WrapPanel>
            </WrapPanel>
        </ItemsPanelTemplate>            
    </ListView.ItemsPanel>
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel >
                <Image Width="214" Height="317" Source="{Binding Image}"/>
                <Label Content="{Binding Name}" />
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

第2页只是一个空的框架

背后的代码

namespace WpfApplication1
{
/// <summary>
/// Interaktionslogik für Page1.xaml
/// </summary>
public partial class Page1 : Page
{
    private ObservableCollection<Series> _series =
      new ObservableCollection<Series>();
    public ObservableCollection<Series> SeriesCollection
    {
        get { return _series; }
    }
    public Page1()
    {
        InitializeComponent();
        DirectoryInfo baseDir = new DirectoryInfo(@"C:'Serien");
        DirectoryInfo[] dirs = baseDir.GetDirectories();
        foreach (DirectoryInfo dir in dirs)
        {
            Series serie = new Series(dir);
            Console.WriteLine("adding " + serie.Name);
            _series.Add(serie);
        }
        Console.WriteLine(_series.Count);
    }
    public void handleSelected(object sender, RoutedEventArgs args)
    {
        Series currentSerie = (Series) myListView.Items.CurrentItem;
        Page2 page = new Page2();
        this.NavigationService.Navigate(page);
        Console.WriteLine(currentSerie.Name);
        Console.WriteLine(currentSerie.GetType());
        Console.WriteLine(currentSerie.ToString());
    }
}
}

所以我点击一个项目来触发SelectionChanged事件,在SelectionChanged中处理它,我导航到第2页,到目前为止还不错。

然后我使用导航窗口中的后退按钮,在中遇到NullpointerException

this.NavigationService.Navigate(page);

我甚至不知道为什么会触发这个方法。很明显,我在做一些愚蠢的事情。请告诉我是什么。谢谢你的时间和帮助。

返回NavigationWindow后出现NullPointerException

这里的问题是您处理了错误的事件。我假设您想通过单击ListViewItem打开Page2。因此,您应该使用鼠标事件而不是SelectionChanged。

例如,您可以在DataTemplate:中订阅StackPanel MouseDown事件

<DataTemplate>
    <StackPanel Background="Transparent"
                MouseDown="StackPanel_MouseDown">
        <Image Width="214" Height="317" Source="{Binding Image}"/>
        <Label Content="{Binding Name}"/>
    </StackPanel>
</DataTemplate>

您可以使用以下方法访问单击的系列:

private void StackPanel_MouseDown(object sender, MouseButtonEventArgs e)
{
    var currentSerie = (Series)((StackPanel)sender).DataContext;
    ...
}

UPD如果你需要真正的点击,你可以使用这样的技巧:

<DataTemplate>
    <Button Click="Button_Click">
        <Button.Template>
            <ControlTemplate TargetType="Button">
                <ContentPresenter/>
            </ControlTemplate>
        </Button.Template>
        <StackPanel Background="Transparent">
            <Image Width="214" Height="317" Source="{Binding Image}"/>
            <Label Content="{Binding Name}"/>
        </StackPanel>
    </Button>
</DataTemplate>

我们使用类似于视图模型的按钮,它能够处理点击。

相关文章:
  • 没有找到相关文章