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-02C#實(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-08C# 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-02C#日期格式字符串的相互轉(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