WPF со страницей навигации NullReferenceException - PullRequest
0 голосов
/ 10 сентября 2011

Я нахожусь в тестовом проекте, где у меня есть один mainWindow.Xaml с рамкой и двумя кнопками:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>

        <Button Name="button1" Click="button1_Click">button1</Button>
        <Button Name="button2" Click="button2_Click">button2</Button>
        <Frame Name="frame"></Frame>
    </StackPanel>
</Window>

Код, который стоит за этим:

private void button1_Click(object sender, RoutedEventArgs e)
{
    frame.Navigate(new Uri("Page1.xaml", UriKind.Relative));
}

private void button2_Click(object sender, RoutedEventArgs e)
{
    frame.Navigate(new Uri("Page2.xaml", UriKind.Relative));
}

Итакпросто.Еврей кнопку открыть страницу на рамке.Проблема в следующем коде:

public partial class Page1 : Page
    {
        public Page1()
        {
            this.Loaded += new RoutedEventHandler(CancelNavigationPage_Loaded);
            this.Unloaded += new RoutedEventHandler(CancelNavigationPage_Unloaded);
            InitializeComponent();
        }
        void CancelNavigationPage_Loaded(object sender, RoutedEventArgs e)
        {
            this.NavigationService.Navigating += new NavigatingCancelEventHandler(NavigationService_Navigating);
        }

        void CancelNavigationPage_Unloaded(object sender, RoutedEventArgs e)
        {


            this.NavigationService.Navigating -= new NavigatingCancelEventHandler(NavigationService_Navigating);

        }

        void NavigationService_Navigating(object sender, NavigatingCancelEventArgs e)
        {
            // Does the user really want to navigate to another page?
            MessageBoxResult result;
            result = MessageBox.Show("Do you want to leave this page?", "Navigation Request", MessageBoxButton.YesNo);

            // If the user doesn't want to navigate away, cancel the navigation
            if (result == MessageBoxResult.No) e.Cancel = true;
        }
    }

Когда я нажимаю кнопку, открывающуюся на странице 1, я хочу предупреждающее сообщение, и если я нажимаю «Нет», я остаюсь на этой странице, в противном случае я перехожу на страницу 2.Но когда я пытаюсь зайти на страницу 2, у меня возникает исключение NullReferenceException в CancelNavigationPage_Unloaded void.Может кто-нибудь объяснить мне, как решить эту проблему?

Заранее спасибо

РЕДАКТИРОВАТЬ: Я изменил таким образом:

void NavigationService_Navigating(object sender, NavigatingCancelEventArgs e)
        {
            if (this.NavigationService.CurrentSource==this.NavigationService.Source)
            {

                this.NavigationService.StopLoading();
                return;
            }
            // Does the user really want to navigate to another page?
            MessageBoxResult result;
            result = MessageBox.Show("Do you want to leave this page?", "Navigation Request", MessageBoxButton.YesNo);

            // If the user doesn't want to navigate away, cancel the navigation 
            if (result == MessageBoxResult.No)
                e.Cancel = true;
            else  // Remove Handler
            {
                if (this.NavigationService != null)
                    this.NavigationService.Navigating -= new NavigatingCancelEventHandler(NavigationService_Navigating);
            }
        }

Таким образом, если я нажму кнопку 2он работает правильно, и если я нажимаю на кнопку 1, которая находится на той же странице 1, приложение не спрашивает меня, хочу ли я покинуть страницу.

1 Ответ

3 голосов
/ 10 сентября 2011

Ваш NavigationService уже имеет значение null в незагруженном событии, когда вы пытаетесь удалить обработчик событий, поэтому вы получаете сообщение об ошибке.

Попробуйте изменить условное выражение в Navigating EventHandler на что-то вроде этого:

        // If the user doesn't want to navigate away, cancel the navigation 
        if (result == MessageBoxResult.No) 
            e.Cancel = true;
        else  // Remove Handler
        {
            if (this.NavigationService != null)
                this.NavigationService.Navigating -= new NavigatingCancelEventHandler(NavigationService_Navigating);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...