【问题标题】:Extend GoBack function in NavigationWindow在 NavigationWindow 中扩展 GoBack 功能
【发布时间】:2013-12-11 00:24:42
【问题描述】:

我有一个带有一些页面的 NavigationWindow。我用按钮从一个导航到另一个,然后返回导航窗口的功能。我的问题是我在某些页面加载时使用了描述符,并且我想在您在导航窗口中使用返回功能时处理它(实际上“描述符”是 Kinect,当页面加载时,它会启动Kinect 与 sensor.start(),我想在返回时停止它,sensor.stop()...但我认为它与此问题的文件描述符相同,并且更多人使用文件描述符)。

有什么方法可以扩展页面中的 GoBack 函数来处理描述符(在我的代码中我只需要调用 sensor.stop(); )?

提前致谢

【问题讨论】:

  • 如果我正确理解您的要求,我的做法是:在页面的 OnNavigatedTo 事件中处理描述符处置。
  • 谢谢。我会尝试 OnNavigated,但在 Page.OnNavigatedFrom 中,因为我在页面中具有描述符的引用,该页面变为非活动状态。
  • 我试过了,但是 WPF 没有实现 Page.OnNavigatedFrom :(
  • 是的,您是对的,因此我在回答中建议了另一种方法。但无论如何,很高兴知道你找到了自己的方法。对有类似问题的其他人有用。
  • 您的方法与我的方法非常相似:使用导航事件。但在我的方法中,您在自己的对象/页面中使用事件,因此您可以直接访问所有对象属性。如果从另一个对象调用它,则必须允许访问要处理的属性:您必须将它们设为公共(公共 Kinect 传感器;而不是私有 KinectSensor 传感器;)或实现类似 public void CloseKinect() 的方法。无论如何,您的回答非常有用,我标记为有用:)

标签: wpf c#-4.0 navigationservice navigationwindow


【解决方案1】:

我在评论中的建议是基于 windows phone 开发经验的。但是在我尝试使用 navigationwindow 在 wpf 中应用该解决方案后,我在 WP/silverlight 中没有发现类似 OnNavigatedTo/OnNavigatedFrom 的东西。

但我发现可以改用 NaviagtionWindow 的导航事件。在这种情况下,您可以获得this.CurrentSource,即 Page2(如果您从 Page2 导航回 Page1)并在该 Page 中处理描述符。

希望这项工作。

【讨论】:

    【解决方案2】:

    好的,我找到了解决方法。它也适用于以下问题:如何在 WPF 中处理对象。奇怪的是,所有关于在 WPF 中处理对象的帖子都谈论 GC 并且您不能自己处理它。是的,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();
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 2022-01-09
      • 2011-10-10
      • 2020-02-14
      相关资源
      最近更新 更多