当我们的手机进入到已知(PS:这个wlan网络必须是已经成功连接的)的wlan网络覆盖范围时,手机可以利用这个高速的wlan网络,那么我们第三方应用程序就有机会利用这个高带宽的网络接口进行通讯。
- <Grid x:Name="LayoutRoot" Background="Transparent">
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="*"/>
- </Grid.RowDefinitions>
-
-
- <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
- <TextBlock x:Name="ApplicationTitle" Text="网络更改监测" Style="{StaticResource PhoneTextNormalStyle}"/>
- </StackPanel>
-
-
- <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="*"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- </Grid.RowDefinitions>
- <TextBlock Grid.Row="0" Text="可用网络接口" FontSize="{StaticResource PhoneFontSizeLarge}"/>
- <ListBox Grid.Row="1" x:Name="lbNetworkInterfaces" ItemsSource="{Binding}" Background="LightGray" >
- <ListBox.ItemTemplate>
- <DataTemplate>
- <TextBlock Text="{Binding}" Margin="5,5,0,5" Foreground="Black"/>
- </DataTemplate>
- </ListBox.ItemTemplate>
- </ListBox>
- <TextBlock Grid.Row="2" Text="事件" FontSize="{StaticResource PhoneFontSizeLarge}"/>
- <ScrollViewer Grid.Row="3" Background="LightGray" BorderThickness="1">
- <ListBox x:Name="lbNetworkChanges" ItemsSource="{Binding}">
- <ListBox.ItemTemplate>
- <DataTemplate>
- <TextBlock Text="{Binding}" Foreground="Black"
- FontSize="{StaticResource PhoneFontSizeNormal}" TextWrapping="Wrap" Margin="5,10,0,10" />
- </DataTemplate>
- </ListBox.ItemTemplate>
- </ListBox>
- </ScrollViewer>
- <TextBlock Grid.Row="4" Text="网络状态" FontSize="{StaticResource PhoneFontSizeLarge}"/>
- <Grid Grid.Row="5" Background="LightGray" >
- <Grid.RowDefinitions>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- <RowDefinition Height="Auto"/>
- </Grid.RowDefinitions>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="Auto"/>
- <ColumnDefinition Width="*"/>
- </Grid.ColumnDefinitions>
- <TextBlock Grid.Row="0" Grid.Column="0" Text="IsNetworkAvailable" Foreground="Black" Margin="5,5,0,5" />
- <TextBlock Grid.Row="0" Grid.Column="1" x:Name="tbIsNetworkAvailable" HorizontalAlignment="Center" Foreground="Black" />
-
- <TextBlock Grid.Row="1" Grid.Column="0" Text="IsWiFiEnabled" Foreground="Black" Margin="5,5,0,5" />
- <TextBlock Grid.Row="1" Grid.Column="1" x:Name="tbIsWiFiEnabled" HorizontalAlignment="Center" Foreground="Black"/>
-
- <TextBlock Grid.Row="2" Grid.Column="0" Text="IsCellularDataEnabled" Foreground="Black" Margin="5,5,0,5" />
- <TextBlock Grid.Row="2" Grid.Column="1" x:Name="tbIsCellularDataEnabled" HorizontalAlignment="Center" Foreground="Black"/>
- </Grid>
- <Button Grid.Row="6" x:Name="btnChangeNetworkSettings" Content="更改网络设置" Click="btnChangeNetworkSettings_Click"/>
- </Grid>
- </Grid>
页面中间,显示关于应用程序接收的任何NetworkAvailabilityChanged 事件的信息。 页面底端,显示一个按钮,通过该按钮可以手动更改网络设置,并触发NetworkAvailabilityChanged 事件。 - using System.Collections.ObjectModel;
- using Microsoft.Phone.Net.NetworkInformation;
- using Microsoft.Phone.Tasks;
-
- public ObservableCollection<string> Changes { get; set; }
-
-
- public ObservableCollection<string> NetworkInterfaces { get; set; }
1.1 将以下代码替换MainPage.cs的构造函数 -
- public MainPage()
- {
- InitializeComponent();
-
-
- Changes = new ObservableCollection<string>();
-
-
- lbNetworkChanges.DataContext = Changes;
-
- NetworkInterfaces = new ObservableCollection<string>();
- lbNetworkInterfaces.DataContext = NetworkInterfaces;
-
-
- DeviceNetworkInformation.NetworkAvailabilityChanged += new EventHandler<NetworkNotificationEventArgs>(ChangeDetected);
-
- UpdateNetworkInterfaces();
- UpdateNetworkStatus();
- }
UpdateNetworkInterfaces() 方法进行初始化UI的网络接口区域。 UpdateNetworkStatus() 方法进程初始化UI的网络状态区域。 上一步,我们已经注册了NetworkAvailabilityChanged事件,下面需要实现相应的回调函数。代码如下:
-
-
-
- void ChangeDetected(object sender, NetworkNotificationEventArgs e)
- {
- string change = string.Empty;
- switch (e.NotificationType)
- {
- case NetworkNotificationType.InterfaceConnected:
- change = "连接到 ";
- break;
- case NetworkNotificationType.InterfaceDisconnected:
- change = "脱离 ";
- break;
- case NetworkNotificationType.CharacteristicUpdate:
- change = "网络变化 ";
- break;
- default:
- change = "未知变化 ";
- break;
- }
-
- string changeInformation = String.Format(" {0} {1} {2} ({3})",
- DateTime.Now.ToString(), change, e.NetworkInterface.InterfaceName,
- e.NetworkInterface.InterfaceType.ToString());
-
-
- Dispatcher.BeginInvoke(() =>
- {
- Changes.Add(changeInformation);
- UpdateNetworkStatus();
- UpdateNetworkInterfaces();
-
- });
-
- }
其中NetworkNotificationEventArgs参数包含所有与通知的变更相关的信息。我们会生成一个信息字符串,字符串中包括何时进行更改,更改的接口名称,接口的类型,然后将信息字符串添加到Changes列表中。我们将UI交互包装在BeginInvoke中,来确保它们在UI线程上执行。 下面实现 UpdateNetworkStatus() 和UpdateNetworkInterfaces()两个方法。
- private void UpdateNetworkInterfaces()
- {
-
- NetworkInterfaces.Clear();
- NetworkInterfaceList networkInterfaceList = new NetworkInterfaceList();
- foreach (NetworkInterfaceInfo networkInterfaceInfo in networkInterfaceList)
- {
- NetworkInterfaces.Add(networkInterfaceInfo.InterfaceName);
- }
- }
-
- private void UpdateNetworkStatus()
- {
- tbIsCellularDataEnabled.Text = (DeviceNetworkInformation.IsCellularDataEnabled) ? "是" : "否";
- tbIsNetworkAvailable.Text = (DeviceNetworkInformation.IsNetworkAvailable) ? "是" : "否";
- tbIsWiFiEnabled.Text = (DeviceNetworkInformation.IsWiFiEnabled) ? "是" : "否";
- }
UpdateNetworkInterfaces 方法会实例化 NetworkInterfaceList 对象。 UpdateNetworkStatus 方法使用 DeviceNetworkInformation 对象上的静态属性更新UI的网络状态区域。 -
-
-
- private void btnChangeNetworkSettings_Click(object sender, RoutedEventArgs e)
- {
- MessageBox.Show("此操作将改变网络设置。设置成功后,你可以通过Back键,返回查看NetworkAvailabilityChanged事件。");
-
-
- ConnectionSettingsTask connectionSettings = new ConnectionSettingsTask();
-
-
- connectionSettings.ConnectionSettingsType = ConnectionSettingsType.AirplaneMode;
- connectionSettings.Show();
-
-
- }
此方法会启动飞行模式的ConnectionSettingsTask。我们可以通过设置飞行模式的打开或关闭。通过更改飞行模式的设置,返回到应用程序中,可以观察到因更改飞行模式引起的网络可用性更改。
我们除了测试飞行模式外,也可以通过修改代码来启动手机网络或WLAN的 C onnectionSettingsTask 。 总结 :如果我们的程序中,需要通过网络进行数据操作,可以在程序中进行检测是否有网络可用,同时可以建议用户进行设置相应的网络连接设置,进行获取程序中数据等网络连接操作。 注意 :虽然手机可以检查到一定数量的WLAN网络,但是这些网络曾经并未进行成功连接过,那么在第三方程序是无法获取到这些网络的。 本文转自 王祖康 51CTO博客,原文链接: http://blog.51cto.com/wzk89/845746 ,如需转载请自行联系原作者