Расширить функцию GoBack в NavigationWindow

У меня есть NavigationWindow с некоторыми страницами. Я перемещаюсь от одного к другому с помощью кнопок и возвращаюсь назад функцией навигационного окна. Моя проблема в том, что я использую дескриптор на некоторых страницах, когда они загружаются, и я хотел бы избавиться от него, когда вы используете функцию возврата в навигационном окне (на самом деле «дескриптор» — это Kinect, и когда страница загружается, она запускается Kinect с sensor.start(), и я хочу остановить его при возврате, sensor.stop()... но я думаю, что это то же самое, что и файловый дескриптор для этой проблемы, и гораздо больше людей работали с файловыми дескрипторами ).

Есть ли способ расширить функцию GoBack на странице для удаления дескрипторов (в моем коде мне нужно только вызвать sensor.stop();)?

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


person Alberto    schedule 11.12.2013    source источник
comment
Если я правильно понимаю, что вам нужно, мой подход будет таким: обработка удаления дескрипторов в событии OnNavigatedTo страницы.   -  person har07    schedule 11.12.2013
comment
Спасибо. Я попробую OnNavigated, но в Page.OnNavigatedFrom, потому что у меня есть ссылка на дескриптор на странице, которая становится неактивной.   -  person Alberto    schedule 11.12.2013
comment
Я пытался, но WPF не реализует Page.OnNavigatedFrom :(   -  person Alberto    schedule 13.12.2013
comment
да, вы правы, поэтому в своем ответе я предложил другой подход. Но в любом случае, приятно знать, что вы нашли свой собственный подход. Будет полезно для других с подобной проблемой.   -  person har07    schedule 13.12.2013
comment
Ваш подход был очень похож на мой подход: использование события Navigating. Но в моем подходе вы используете событие в собственном объекте/странице, поэтому у вас есть прямой доступ ко всем свойствам объекта. Если вы вызываете его из другого объекта, вы должны разрешить доступ к свойствам, которые хотите удалить: вы должны сделать их общедоступными (общедоступный датчик Kinect; вместо частного датчика KinectSensor;) или реализовать такой метод, как public void CloseKinect(). В любом случае, ваш ответ был очень полезен, и я отметил его как полезный :)   -  person Alberto    schedule 13.12.2013


Ответы (2)


Мое предложение в комментарии было основано на опыте разработки Windows Phone... но после того, как я попытался применить это решение в wpf с помощью navigationwindow, я не нашел ничего похожего на OnNavigatedTo/OnNavigatedFrom в WP/silverlight.

Но я обнаружил, что вместо этого можно использовать событие Navigation NaviagtionWindow. В этом случае вы можете получить this.CurrentSource, который является страницей 2 (если вы вернетесь со страницы 2 на страницу 1), и удалите дескрипторы на этой странице.

Надеюсь, эта работа.

person har07    schedule 11.12.2013

Хорошо, я нашел, как сделать обходной путь. Это также относится к вопросу: как избавиться от объекта в WPF. Странно, что все сообщения об удалении объектов в WPF говорят о сборщике мусора и о том, что вы не можете удалить его самостоятельно. Да, GC утилизирует объекты автоматически, но когда захочет. Но, может быть, вы хотите избавиться немедленно или у вас есть объект, который требует предварительных операций перед удалением. В моем случае Kinect необходимо остановить перед удалением (вы можете удалять без остановки, но датчик kinect ir все еще работает). И GC не является решением, потому что мне нужно остановить его перед удалением.

Итак, решение:

public partial class MyClass : Page
{
    private KinectSensor sensor;

    public MyClass()
    {
        InitializeComponent();
        this.Loaded += (s, e) =>  { NavigationService.Navigating += NavigationService_Navigating; };

        // What you want to add to the constructor
        // I want to start Kinect
        sensor = KinectSensor.KinectSensors.FirstOrDefault(k => k.Status == KinectStatus.Connected);
        sensor.Start();

    }

    public void NavigationService_Navigating(object sender, NavigatingCancelEventArgs e)
    {
        if (e.NavigationMode == NavigationMode.Back)
        {
            // What you want to do.
            // I want to stop and dispose Kinect
            if (sensor != null)
            {
                sensor.Stop();
                sensor.Dispose();
            }
        }
    }
}
person Alberto    schedule 12.12.2013