1

我有这个应用程序正在监听 NFC 设备的到来。它基于 Microsoft 的示例:

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。

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

4

2 回答 2

1

您应该在基于 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/etc 的消息。

于 2013-01-18T18:22:41.243 回答
0

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

if (proximityDevice != null)
{
    if(proximityDevice.DeviceArrived == null)
       proximityDevice.DeviceArrived += ProximityDeviceArrived;
}
于 2013-01-18T09:43:00.990 回答