Monitoring Network Changes in WP8

This article explains how to of monitor the network changes in Windows Phone.

Introduction

This article explains how to of monitor the network changes in Windows Phone. This is a very necessary and required feature for all the apps that use of internet connections. For example if you you want to request something from the internet or send something to a server that might require a data connection then you may switch to WiFi on detecting the change or you can alert the user on activation of a cellular data connection. So let's start.

Device Network Information

This class Contains network information for a specific Windows Phone device. Using this class we can check various device network parameters like it's availability, roaming, network change, WiFi status and so on. To use this class you need to include the namespace "Microsoft.Phone.Net.NetworkInformation".

Network Availability Change

This event helps in monitoring the network changes. Whenever any change happens in the Network this event is triggered.

Network Notification Event Args

This argument is sent to the network change event handler. It consists of the following important properties:

  • Network Interface
    Contains all the information about the interface like bandwidth, name, status and so on.
     
  • Notification type
    Type of change that has occurred. It may be a connect, disconnect and so on.

Demo

To run this project, create a new project and add the following code to the XAML file.

XAML

<phone:PhoneApplicationPage

    x:Class="Demo.MainPage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"

    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    mc:Ignorable="d"

    FontFamily="{StaticResource PhoneFontFamilyNormal}"

    FontSize="{StaticResource PhoneFontSizeNormal}"

    Foreground="{StaticResource PhoneForegroundBrush}"

    SupportedOrientations="Portrait" Orientation="Portrait"

    shell:SystemTray.IsVisible="True">

 

    <!--LayoutRoot is the root grid where all page content is placed-->

    <Grid x:Name="LayoutRoot" Background="Transparent">

        <Grid.RowDefinitions>

            <RowDefinition Height="Auto"/>

            <RowDefinition Height="*"/>

        </Grid.RowDefinitions>

 

        <!--TitlePanel contains the name of the application and page title-->

        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">

            <TextBlock Text="Demo" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>

            <TextBlock  Text="Demo" Margin="9,-7,0,0" FontSize="40" Tap="TextBlock_Tap"/>

        </StackPanel>

 

        <!--ContentPanel - place additional content here-->

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

            <Button Name="startBtn" Click="startBtn_Click" Content="Start N/W Monitoring" HorizontalAlignment="Left" Margin="0,0,0,268" Width="446" Height="72" VerticalAlignment="Bottom"/>

        </Grid>

    </Grid>

</phone:PhoneApplicationPage>

C# Code Behind

using Microsoft.Phone.Controls;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using Windows.Phone.Speech.Synthesis;

using Windows.Devices.Sensors;

using System.Diagnostics;

using Microsoft.Phone.Net.NetworkInformation;

using Microsoft.Phone.Tasks;

 

namespace Demo

{

    public partial class MainPage : PhoneApplicationPage

    {

        // Constructor

        public MainPage()

        {

            InitializeComponent();

        }

        private void startBtn_Click(object sender, RoutedEventArgs e)

        {

            DeviceNetworkInformation.NetworkAvailabilityChanged += DeviceNetworkInformation_NetworkAvailabilityChanged;

            startBtn.IsEnabled = false;

        }

 

        void DeviceNetworkInformation_NetworkAvailabilityChanged(object sender, NetworkNotificationEventArgs e)

        {

            this.Dispatcher.BeginInvoke(() =>

            {

                MessageBox.Show("Description:" + e.NetworkInterface.Description + "\nBandwidth" + e.NetworkInterface.Bandwidth+"\n Status:"+e.NetworkInterface.InterfaceState);

            });

        }

 

        private void TextBlock_Tap(object sender, System.Windows.Input.GestureEventArgs e)

        {

            new ConnectionSettingsTask() { ConnectionSettingsType = ConnectionSettingsType.WiFi }.Show();

        }

    }

}

Output