欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#?WPF實現(xiàn)顯示本機網(wǎng)絡通訊狀態(tài)

 更新時間:2024年12月09日 09:39:47   作者:猿享天開  
這篇文章主要為大家詳細介紹了如何在?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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于WPF實現(xiàn)3D畫廊動畫效果的示例代碼

    基于WPF實現(xiàn)3D畫廊動畫效果的示例代碼

    這篇文章主要為大家詳細介紹了如何基于WPF實現(xiàn)簡單的3D畫廊動畫效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-02-02
  • C#設置MDI子窗體只能彈出一個的方法

    C#設置MDI子窗體只能彈出一個的方法

    這篇文章主要介紹了C#設置MDI子窗體只能彈出一個的方法,很實用的技巧,需要的朋友可以參考下
    2014-08-08
  • c#操作xml文件示例

    c#操作xml文件示例

    對于XML讀寫操作,項目中經(jīng)常要用到,之前木有好好總結過,例如LINQ TO XML也用過,這次無意發(fā)現(xiàn)XPATH對于XML的查詢極為方便,索性把XML的操作總結以便后續(xù)方便使用
    2014-03-03
  • C#實現(xiàn)DataTable,List和Json轉換的方法

    C#實現(xiàn)DataTable,List和Json轉換的方法

    這篇文章主要介紹了C#實現(xiàn)DataTable,List和Json轉換的方法,結合實例形式分析了DataTable、list、DataReader、DataSet等轉換成JSON的相關實現(xiàn)技巧,需要的朋友可以參考下
    2016-08-08
  • C# Websocket連接實現(xiàn)wss協(xié)議

    C# Websocket連接實現(xiàn)wss協(xié)議

    本文主要介紹了C# Websocket連接實現(xiàn)wss協(xié)議,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 深入解析C#設計模式編程中對建造者模式的運用

    深入解析C#設計模式編程中對建造者模式的運用

    這篇文章主要介紹了C#設計模式編程中對建造者模式的運用,文中還介紹了在.NET框架下建造者模式編寫思路的實現(xiàn),需要的朋友可以參考下
    2016-02-02
  • C#定時器和隨機數(shù)

    C#定時器和隨機數(shù)

    在前一篇中我們介紹了鍵盤和鼠標事件,其實還有一個非常常用的事件,就是定時器事件,如果要對程序實現(xiàn)時間上的控制,那么就要使用到定時器。而隨機數(shù)也是很常用的一個功能,在我們要想產(chǎn)生一個隨機的結果時就要使用到隨機數(shù)。本文我們就來簡單介紹一下定時器和隨機數(shù)。
    2015-06-06
  • C#日期格式字符串的相互轉換操作實例分析

    C#日期格式字符串的相互轉換操作實例分析

    這篇文章主要介紹了C#日期格式字符串的相互轉換操作,結合實例形式分析了C#日期格式字符串的相互轉換操作函數(shù)與相關使用技巧,需要的朋友可以參考下
    2019-08-08
  • C#中backgroundWorker類的用法詳解

    C#中backgroundWorker類的用法詳解

    這篇文章主要介紹了C#使用backgroundWorker實現(xiàn)多線程的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • .net中前臺javascript與后臺c#函數(shù)相互調用問題

    .net中前臺javascript與后臺c#函數(shù)相互調用問題

    .net中前臺javascript與后臺c#函數(shù)相互調用問題...
    2007-12-12

最新評論