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

