C#?WPF實現(xiàn)顯示本機網(wǎng)絡通訊狀態(tài)
概述
在 WPF 中實現(xiàn)一個界面來顯示本機網(wǎng)絡接口的狀態(tài),通常需要以下幾個步驟:
1.獲取網(wǎng)絡接口信息:使用 System.Net.NetworkInformation 命名空間獲取網(wǎng)絡接口的狀態(tài)。
2.創(chuàng)建 WPF 界面:使用 XAML 設計用戶界面,顯示每個網(wǎng)絡接口的信息。
3.綁定數(shù)據(jù):將獲取的網(wǎng)絡接口信息綁定到 WPF 界面的控件中。
具體實現(xiàn)
下面是一個簡單的示例,展示如何實現(xiàn)這一功能。
第一步:獲取網(wǎng)絡接口信息
使用 NetworkInterface 類獲取當前機器的網(wǎng)絡接口信息,我們將獲取網(wǎng)絡接口的名稱、連接類型、IP 地址和當前的網(wǎng)絡接收速率。為了獲取接收速率,我們可以使用性能計數(shù)器 System.Diagnostics.PerformanceCounter。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Net;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Windows.Threading;
// 定義 NetworkInterfaceInfo 類用于封裝網(wǎng)絡接口的關(guān)鍵信息
public class NetworkInterfaceInfo
{
// 網(wǎng)絡接口的名稱
public string Name { get; set; }
// 網(wǎng)絡接口的描述信息
public string Description { get; set; }
// 網(wǎng)絡連接類型(如以太網(wǎng)、無線等)
public string ConnectionType { get; set; }
// 網(wǎng)絡接口的 IP 地址
public string IPAddress { get; set; }
// 網(wǎng)絡接口的接收數(shù)據(jù)速率
public string ReceiveRate { get; set; }
}
// 定義 NetworkInfoProvider 類用于提供網(wǎng)絡接口的信息
public class NetworkInfoProvider
{
// 存儲網(wǎng)絡接口與其對應的 PerformanceCounter 的映射
private readonly Dictionary<string, PerformanceCounter> receiveCounters = new Dictionary<string, PerformanceCounter>();
// 構(gòu)造函數(shù),初始化網(wǎng)絡接口的性能計數(shù)器
public NetworkInfoProvider()
{
// 遍歷所有可用的網(wǎng)絡接口
foreach (var ni in NetworkInterface.GetAllNetworkInterfaces())
{
// 僅處理正在運行的網(wǎng)絡接口
if (ni.OperationalStatus == OperationalStatus.Up)
{
try
{
// 創(chuàng)建一個 PerformanceCounter 用于獲取接收速率
var counter = new PerformanceCounter("Network Interface", "Bytes Received/sec", ni.Description);
// 初次讀取來初始化計數(shù)器,避免首次讀取時數(shù)據(jù)不準確
counter.NextValue();
// 將計數(shù)器存儲到字典中,以接口描述為鍵
receiveCounters[ni.Description] = counter;
}
catch (InvalidOperationException ex)
{
// 處理初始化計數(shù)器時的異常
Console.WriteLine($"Error initializing counter for {ni.Description}: {ex.Message}");
}
}
}
}
// 獲取所有正在運行的網(wǎng)絡接口的信息
public List<NetworkInterfaceInfo> GetNetworkInterfaces()
{
var interfaces = new List<NetworkInterfaceInfo>();
// 遍歷所有可用的網(wǎng)絡接口
foreach (var ni in NetworkInterface.GetAllNetworkInterfaces())
{
// 僅處理正在運行的網(wǎng)絡接口
if (ni.OperationalStatus == OperationalStatus.Up)
{
// 獲取該接口的 IP 屬性
var ipProps = ni.GetIPProperties();
// 獲取第一個 IPv4 地址
var ipAddress = ipProps.UnicastAddresses
.Where(ip => ip.Address.AddressFamily ==
System.Net.Sockets.AddressFamily.InterNetwork)
.Select(ip => ip.Address.ToString())
.FirstOrDefault();
// 獲取接收速率并轉(zhuǎn)換為 Kbps
string receiveRate = GetReceiveRate(ni.Description) + " Kbps";
// 創(chuàng)建一個 NetworkInterfaceInfo 實例并添加到列表中
interfaces.Add(new NetworkInterfaceInfo
{
Name = ni.Name,
Description = ni.Description,
ConnectionType = ni.NetworkInterfaceType.ToString(),
IPAddress = ipAddress ?? "N/A",
ReceiveRate = receiveRate
});
}
}
return interfaces;
}
// 獲取指定網(wǎng)絡接口的接收速率
private string GetReceiveRate(string interfaceDescription)
{
// 檢查字典中是否存在指定接口的計數(shù)器
if (receiveCounters.TryGetValue(interfaceDescription, out var counter))
{
// 將字節(jié)每秒轉(zhuǎn)換為千比特每秒 (Kbps)
return (counter.NextValue() * 8 / 1024).ToString("F2");
}
// 如果沒有計數(shù)器,返回 0.00
return "0.00";
}
}代碼解釋:
NetworkInterfaceInfo 類:用來封裝單個網(wǎng)絡接口的信息,包括名稱、描述、連接類型、IP 地址和接收速率。這樣可以方便地將接口信息展示到UI。
NetworkInfoProvider 類:負責初始化和管理網(wǎng)絡接口的性能計數(shù)器,并提供方法來獲取當前活動的網(wǎng)絡接口及其相關(guān)信息。
構(gòu)造函數(shù):遍歷所有網(wǎng)絡接口,僅對處于活動狀態(tài)(OperationalStatus.Up)的接口進行處理。為每個接口創(chuàng)建一個 PerformanceCounter,用于監(jiān)測接收速率。初次調(diào)用 NextValue() 是為了初始化計數(shù)器值。
GetNetworkInterfaces 方法:返回當前活動網(wǎng)絡接口的信息列表。對于每個接口,獲取其 IPv4 地址和接收速率。
GetReceiveRate 方法:返回指定接口的接收速率,轉(zhuǎn)換為 Kbps。如果該接口沒有計數(shù)器,返回 "0.00"。
第二步:創(chuàng)建 WPF 界面
設計一個簡單的 WPF 界面,在 MainWindow.xaml 中使用 ListView 來顯示信息。
<Window x:Class="NetworkStatusApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Network Status" Height="400" Width="600">
<Grid>
<ListView Name="NetworkInterfacesListView">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="120" />
<GridViewColumn Header="Description" DisplayMemberBinding="{Binding Description}" Width="180" />
<GridViewColumn Header="Connection Type" DisplayMemberBinding="{Binding ConnectionType}" Width="100" />
<GridViewColumn Header="IP Address" DisplayMemberBinding="{Binding IPAddress}" Width="120" />
<GridViewColumn Header="Receive Rate (Kbps)" DisplayMemberBinding="{Binding ReceiveRate}" Width="120" />
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>第三步:綁定數(shù)據(jù)
在 MainWindow.xaml.cs 中,從 NetworkInfoProvider 獲取數(shù)據(jù)并綁定到 ListView。
using System.Windows;
using System.Windows.Threading;
using System.Collections.ObjectModel;
// 定義 MainWindow 類,繼承自 WPF 的 Window 類
public partial class MainWindow : Window
{
// 定義一個 NetworkInfoProvider 實例,用于獲取網(wǎng)絡接口信息
private NetworkInfoProvider provider;
// 定義一個可觀察的集合,用于存儲和更新網(wǎng)絡接口信息
private ObservableCollection<NetworkInterfaceInfo> networkInterfaces;
// MainWindow 構(gòu)造函數(shù)
public MainWindow()
{
// 初始化 XAML 界面組件
InitializeComponent();
// 初始化 ObservableCollection 實例,并將其綁定到 ListView 控件
networkInterfaces = new ObservableCollection<NetworkInterfaceInfo>();
NetworkInterfacesListView.ItemsSource = networkInterfaces;
// 使用 BackgroundWorker 執(zhí)行異步初始化,以避免阻塞 UI 線程
BackgroundWorker worker = new BackgroundWorker();
// 注冊 DoWork 事件,用于后臺線程執(zhí)行
worker.DoWork += (s, e) => InitializeNetworkProvider();
// 注冊 RunWorkerCompleted 事件,用于后臺線程完成后執(zhí)行
worker.RunWorkerCompleted += (s, e) =>
{
// 初始化完成后,立即更新界面
UpdateNetworkInterfacesImmediately();
// 啟動定時更新網(wǎng)絡接口信息
StartUpdating();
};
// 開始執(zhí)行后臺操作
worker.RunWorkerAsync();
}
// 初始化 NetworkInfoProvider 實例
private void InitializeNetworkProvider()
{
provider = new NetworkInfoProvider();
}
// 啟動定時器,用于定期更新網(wǎng)絡接口信息
private void StartUpdating()
{
// 創(chuàng)建調(diào)度計時器
DispatcherTimer timer = new DispatcherTimer();
// 設置定時間隔為2秒
timer.Interval = TimeSpan.FromSeconds(2);
// 注冊定時器的 Tick 事件,用于觸發(fā)更新操作
timer.Tick += UpdateNetworkInterfaces;
// 啟動定時器
timer.Start();
}
// 立即更新網(wǎng)絡接口信息,并更新到界面
private void UpdateNetworkInterfacesImmediately()
{
// 清空當前的網(wǎng)絡接口信息
networkInterfaces.Clear();
// 獲取最新的網(wǎng)絡接口信息并添加到集合中
foreach (var ni in provider.GetNetworkInterfaces())
{
networkInterfaces.Add(ni);
}
}
// 定期更新網(wǎng)絡接口信息的方法
private void UpdateNetworkInterfaces(object sender, EventArgs e)
{
// 清空當前的網(wǎng)絡接口信息
networkInterfaces.Clear();
// 獲取最新的網(wǎng)絡接口信息并添加到集合中
foreach (var ni in provider.GetNetworkInterfaces())
{
networkInterfaces.Add(ni);
}
}
}注意事項
權(quán)限:某些網(wǎng)絡接口信息可能需要管理員權(quán)限才能訪問。
更新接口狀態(tài):如果需要動態(tài)更新網(wǎng)絡接口狀態(tài),可以使用定時器或事件通知機制。
這個示例展示了一個基礎(chǔ)實現(xiàn),我們可以根據(jù)自己的實際需求進一步擴展和美化 UI。
到此這篇關(guān)于C# WPF實現(xiàn)顯示本機網(wǎng)絡通訊狀態(tài)的文章就介紹到這了,更多相關(guān)WPF顯示本機網(wǎng)絡通訊狀態(tài)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實現(xiàn)DataTable,List和Json轉(zhuǎn)換的方法
這篇文章主要介紹了C#實現(xiàn)DataTable,List和Json轉(zhuǎn)換的方法,結(jié)合實例形式分析了DataTable、list、DataReader、DataSet等轉(zhuǎn)換成JSON的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2016-08-08
C# Websocket連接實現(xiàn)wss協(xié)議
本文主要介紹了C# Websocket連接實現(xiàn)wss協(xié)議,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05
.net中前臺javascript與后臺c#函數(shù)相互調(diào)用問題
.net中前臺javascript與后臺c#函數(shù)相互調(diào)用問題...2007-12-12

