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)絡接口的關鍵信息 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>(); // 構造函數(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(); // 獲取接收速率并轉換為 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é)每秒轉換為千比特每秒 (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)絡接口及其相關信息。
構造函數(shù):遍歷所有網(wǎng)絡接口,僅對處于活動狀態(tài)(OperationalStatus.Up)的接口進行處理。為每個接口創(chuàng)建一個 PerformanceCounter,用于監(jiān)測接收速率。初次調用 NextValue() 是為了初始化計數(shù)器值。
GetNetworkInterfaces 方法:返回當前活動網(wǎng)絡接口的信息列表。對于每個接口,獲取其 IPv4 地址和接收速率。
GetReceiveRate 方法:返回指定接口的接收速率,轉換為 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 構造函數(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)建調度計時器 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); } } }
注意事項
權限:某些網(wǎng)絡接口信息可能需要管理員權限才能訪問。
更新接口狀態(tài):如果需要動態(tài)更新網(wǎng)絡接口狀態(tài),可以使用定時器或事件通知機制。
這個示例展示了一個基礎實現(xiàn),我們可以根據(jù)自己的實際需求進一步擴展和美化 UI。
到此這篇關于C# WPF實現(xiàn)顯示本機網(wǎng)絡通訊狀態(tài)的文章就介紹到這了,更多相關WPF顯示本機網(wǎng)絡通訊狀態(tài)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#實現(xiàn)DataTable,List和Json轉換的方法
這篇文章主要介紹了C#實現(xiàn)DataTable,List和Json轉換的方法,結合實例形式分析了DataTable、list、DataReader、DataSet等轉換成JSON的相關實現(xiàn)技巧,需要的朋友可以參考下2016-08-08C# Websocket連接實現(xiàn)wss協(xié)議
本文主要介紹了C# Websocket連接實現(xiàn)wss協(xié)議,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05.net中前臺javascript與后臺c#函數(shù)相互調用問題
.net中前臺javascript與后臺c#函數(shù)相互調用問題...2007-12-12