邻近事件被注册多次

本文关键字:注册 事件 | 更新日期: 2023-09-27 17:54:37

我有这个应用程序,它正在侦听NFC设备的到来。这是基于微软的例子:

http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh465221.aspx

Windows.Networking.Proximity.ProximityDevice proximityDevice;
public MainPage()
{
    InitializeComponent();
    proximityDevice = Windows.Networking.Proximity.ProximityDevice.GetDefault();
    if (proximityDevice != null)
    {
        proximityDevice.DeviceArrived += ProximityDeviceArrived;
    }
    else
    {
        MessageTextBlock.Text += "Failed to initialize proximity device.'n";
    }
}

这是在我的MainPage.xaml实现的。我的问题是,如果我导航到另一个页面,然后返回按下后退按钮(我没有覆盖的功能),我现在有多个事件,它似乎。

所以当一个设备到达之前导航它注册它一次,当我已经到另一个。xaml页面并返回DeviceArrived被触发多次,即使只有一个设备到达。

我必须以某种方式锁定它吗?

邻近事件被注册多次

在基于XAML的框架中,静态事件应该遵循的设计模式是在OnNavigatedTo方法覆盖中注册,在OnNavigatedFrom方法覆盖中取消注册。

private ProximityDevice proximity = ProximityDevice.GetDefault();
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (proximity != null)
    {
        proximity.DeviceArrived += proximity_DeviceArrived;
    }   
    base.OnNavigatedTo(e);
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    if (proximity != null)
    {
        proximity.DeviceArrived -= proximity_DeviceArrived;
    }   
    base.OnNavigatedFrom(e);
}

或者,对于架构更合理的解决方案,在单例类中注册静态事件,并将其转换为Messenger/EventAggregator/等的消息。

对于每个设备,您将多次注册到同一事件。相反,只需通过检查事件之前是否已被注册来只注册一次事件。

if (proximityDevice != null)
{
    if(proximityDevice.DeviceArrived == null)
       proximityDevice.DeviceArrived += ProximityDeviceArrived;
}