C#?WPF實(shí)現(xiàn)顯示本機(jī)網(wǎng)絡(luò)通訊狀態(tài)
概述
在 WPF 中實(shí)現(xiàn)一個(gè)界面來(lái)顯示本機(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ì)用戶(hù)界面,顯示每個(gè)網(wǎng)絡(luò)接口的信息。
3.綁定數(shù)據(jù):將獲取的網(wǎng)絡(luò)接口信息綁定到 WPF 界面的控件中。
具體實(shí)現(xiàn)
下面是一個(gè)簡(jiǎn)單的示例,展示如何實(shí)現(xiàn)這一功能。
第一步:獲取網(wǎng)絡(luò)接口信息
使用 NetworkInterface 類(lèi)獲取當(dāng)前機(jī)器的網(wǎng)絡(luò)接口信息,我們將獲取網(wǎng)絡(luò)接口的名稱(chēng)、連接類(lèi)型、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 類(lèi)用于封裝網(wǎng)絡(luò)接口的關(guān)鍵信息
public class NetworkInterfaceInfo
{
// 網(wǎng)絡(luò)接口的名稱(chēng)
public string Name { get; set; }
// 網(wǎng)絡(luò)接口的描述信息
public string Description { get; set; }
// 網(wǎng)絡(luò)連接類(lèi)型(如以太網(wǎng)、無(wú)線等)
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 類(lèi)用于提供網(wǎng)絡(luò)接口的信息
public class NetworkInfoProvider
{
// 存儲(chǔ)網(wǎng)絡(luò)接口與其對(duì)應(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);
// 初次讀取來(lái)初始化計(jì)數(shù)器,避免首次讀取時(shí)數(shù)據(jù)不準(zhǔn)確
counter.NextValue();
// 將計(jì)數(shù)器存儲(chǔ)到字典中,以接口描述為鍵
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");
}
// 如果沒(méi)有計(jì)數(shù)器,返回 0.00
return "0.00";
}
}代碼解釋?zhuān)?/p>
NetworkInterfaceInfo 類(lèi):用來(lái)封裝單個(gè)網(wǎng)絡(luò)接口的信息,包括名稱(chēng)、描述、連接類(lèi)型、IP 地址和接收速率。這樣可以方便地將接口信息展示到UI。
NetworkInfoProvider 類(lèi):負(fù)責(zé)初始化和管理網(wǎng)絡(luò)接口的性能計(jì)數(shù)器,并提供方法來(lái)獲取當(dāng)前活動(dòng)的網(wǎng)絡(luò)接口及其相關(guān)信息。
構(gòu)造函數(shù):遍歷所有網(wǎng)絡(luò)接口,僅對(duì)處于活動(dòng)狀態(tài)(OperationalStatus.Up)的接口進(jìn)行處理。為每個(gè)接口創(chuàng)建一個(gè) PerformanceCounter,用于監(jiān)測(cè)接收速率。初次調(diào)用 NextValue() 是為了初始化計(jì)數(shù)器值。
GetNetworkInterfaces 方法:返回當(dāng)前活動(dòng)網(wǎng)絡(luò)接口的信息列表。對(duì)于每個(gè)接口,獲取其 IPv4 地址和接收速率。
GetReceiveRate 方法:返回指定接口的接收速率,轉(zhuǎn)換為 Kbps。如果該接口沒(méi)有計(jì)數(shù)器,返回 "0.00"。
第二步:創(chuàng)建 WPF 界面
設(shè)計(jì)一個(gè)簡(jiǎn)單的 WPF 界面,在 MainWindow.xaml 中使用 ListView 來(lái)顯示信息。
<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 類(lèi),繼承自 WPF 的 Window 類(lèi)
public partial class MainWindow : Window
{
// 定義一個(gè) NetworkInfoProvider 實(shí)例,用于獲取網(wǎng)絡(luò)接口信息
private NetworkInfoProvider provider;
// 定義一個(gè)可觀察的集合,用于存儲(chǔ)和更新網(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();
// 注冊(cè) DoWork 事件,用于后臺(tái)線程執(zhí)行
worker.DoWork += (s, e) => InitializeNetworkProvider();
// 注冊(cè) RunWorkerCompleted 事件,用于后臺(tái)線程完成后執(zhí)行
worker.RunWorkerCompleted += (s, e) =>
{
// 初始化完成后,立即更新界面
UpdateNetworkInterfacesImmediately();
// 啟動(dòng)定時(shí)更新網(wǎng)絡(luò)接口信息
StartUpdating();
};
// 開(kāi)始執(zhí)行后臺(tái)操作
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);
// 注冊(cè)定時(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)限才能訪問(wè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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于WPF實(shí)現(xiàn)3D畫(huà)廊動(dòng)畫(huà)效果的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何基于WPF實(shí)現(xiàn)簡(jiǎn)單的3D畫(huà)廊動(dòng)畫(huà)效果,文中的示例代碼講解詳細(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é)議,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
深入解析C#設(shè)計(jì)模式編程中對(duì)建造者模式的運(yùn)用
這篇文章主要介紹了C#設(shè)計(jì)模式編程中對(duì)建造者模式的運(yùn)用,文中還介紹了在.NET框架下建造者模式編寫(xiě)思路的實(shí)現(xiàn),需要的朋友可以參考下2016-02-02
C#日期格式字符串的相互轉(zhuǎn)換操作實(shí)例分析
這篇文章主要介紹了C#日期格式字符串的相互轉(zhuǎn)換操作,結(jié)合實(shí)例形式分析了C#日期格式字符串的相互轉(zhuǎn)換操作函數(shù)與相關(guān)使用技巧,需要的朋友可以參考下2019-08-08
C#中backgroundWorker類(lèi)的用法詳解
這篇文章主要介紹了C#使用backgroundWorker實(shí)現(xiàn)多線程的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
.net中前臺(tái)javascript與后臺(tái)c#函數(shù)相互調(diào)用問(wèn)題
.net中前臺(tái)javascript與后臺(tái)c#函數(shù)相互調(diào)用問(wèn)題...2007-12-12

