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中取消订阅是一个很好的使用模式。