C# 如何在Windows运行时应用程序中正确订阅事件?

C# 如何在Windows运行时应用程序中正确订阅事件?,c#,xaml,windows-runtime,windows-phone,windows-phone-8.1,C#,Xaml,Windows Runtime,Windows Phone,Windows Phone 8.1,我订阅构造函数中的OrientationChanged事件,如下所示: public SecondPage() { this.InitializeComponent(); deviceOrientationSensor = SimpleOrientationSensor.GetDefault(); if (deviceOrientationSensor != null) { deviceOrientationSensor.Orientation

我订阅构造函数中的
OrientationChanged
事件,如下所示:

public SecondPage()
{
    this.InitializeComponent();

    deviceOrientationSensor = SimpleOrientationSensor.GetDefault();

    if (deviceOrientationSensor != null)
    {
        deviceOrientationSensor.OrientationChanged += OrientationChanged;
    }
}
然后:

private void OrientationChanged(SimpleOrientationSensor sender, SimpleOrientationSensorOrientationChangedEventArgs args)
{
    deviceOrientation = args.Orientation;
    // the rest...
}
所以问题是,当我导航回另一个页面或进入手机启动屏幕时,下次它处理
OrientationChanged
事件两次,再处理三次,依此类推

它似乎再次订阅该事件,而不删除以前的订阅。它不仅发生在方向改变事件中,也发生在任何其他事件中

我原以为我可以通过
OnNavigatedFrom
方法取消订阅,但与以前的Windows Phone Silverlight应用程序不同,这种情况似乎不一定会发生

如何防止多个订阅?谢谢。

1)不要在页面中订阅,而是在App.Xaml.cs中订阅

2) 在OnNavigatedFrom方法中取消订阅:

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
  deviceOrientationSensor.OrientationChanged -= OrientationChanged;
}

谢谢你,马特。但这仅限于此页面,而且,如果我在页面的
OnNavigatedFrom
方法中取消订阅,下一次订阅发生在哪里?订阅将在页面的构造函数中生成,因此每次返回页面时,它都会重新生成订阅。这就是问题的原因。我个人喜欢在导航到的
中订阅/取消订阅,因为这两种方法通常紧挨着对方,所以很容易看出我是否忘记了。在导航到
中订阅有什么本质上不好的地方吗?内特-你完全正确。这两个项目是解决这一特定问题的两个选择。在OnNavigatedTo中订阅,在OnNavigatedFrom中取消订阅是一个很好的使用模式。