C#应用开发:基于C# WPF界面实现本机网络通讯状态(下载速度)的显示
目录
概述
具体实现
第一步:获取网络接口信息
代码解释:
第二步:创建 WPF 界面
第三步:绑定数据
注意事项
概述
在 WPF 中实现一个界面来显示本机网络接口的状态,通常需要以下几个步骤:
-
获取网络接口信息:使用
System.Net.NetworkInformation
命名空间获取网络接口的状态。 -
创建 WPF 界面:使用 XAML 设计用户界面,显示每个网络接口的信息。
-
绑定数据:将获取的网络接口信息绑定到 WPF 界面的控件中。
具体实现
下面是一个简单的示例,展示如何实现这一功能。
第一步:获取网络接口信息
使用 NetworkInterface
类获取当前机器的网络接口信息,我们将获取网络接口的名称、连接类型、IP 地址和当前的网络接收速率。为了获取接收速率,我们可以使用性能计数器 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 类用于封装网络接口的关键信息
public class NetworkInterfaceInfo
{// 网络接口的名称public string Name { get; set; }// 网络接口的描述信息public string Description { get; set; }// 网络连接类型(如以太网、无线等)public string ConnectionType { get; set; }// 网络接口的 IP 地址public string IPAddress { get; set; }// 网络接口的接收数据速率public string ReceiveRate { get; set; }
}// 定义 NetworkInfoProvider 类用于提供网络接口的信息
public class NetworkInfoProvider
{// 存储网络接口与其对应的 PerformanceCounter 的映射private readonly Dictionary<string, PerformanceCounter> receiveCounters = new Dictionary<string, PerformanceCounter>();// 构造函数,初始化网络接口的性能计数器public NetworkInfoProvider(){// 遍历所有可用的网络接口foreach (var ni in NetworkInterface.GetAllNetworkInterfaces()){// 仅处理正在运行的网络接口if (ni.OperationalStatus == OperationalStatus.Up){try{// 创建一个 PerformanceCounter 用于获取接收速率var counter = new PerformanceCounter("Network Interface", "Bytes Received/sec", ni.Description);// 初次读取来初始化计数器,避免首次读取时数据不准确counter.NextValue();// 将计数器存储到字典中,以接口描述为键receiveCounters[ni.Description] = counter;}catch (InvalidOperationException ex){// 处理初始化计数器时的异常Console.WriteLine($"Error initializing counter for {ni.Description}: {ex.Message}");}}}}// 获取所有正在运行的网络接口的信息public List<NetworkInterfaceInfo> GetNetworkInterfaces(){var interfaces = new List<NetworkInterfaceInfo>();// 遍历所有可用的网络接口foreach (var ni in NetworkInterface.GetAllNetworkInterfaces()){// 仅处理正在运行的网络接口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();// 获取接收速率并转换为 Kbpsstring receiveRate = GetReceiveRate(ni.Description) + " Kbps";// 创建一个 NetworkInterfaceInfo 实例并添加到列表中interfaces.Add(new NetworkInterfaceInfo{Name = ni.Name,Description = ni.Description,ConnectionType = ni.NetworkInterfaceType.ToString(),IPAddress = ipAddress ?? "N/A",ReceiveRate = receiveRate});}}return interfaces;}// 获取指定网络接口的接收速率private string GetReceiveRate(string interfaceDescription){// 检查字典中是否存在指定接口的计数器if (receiveCounters.TryGetValue(interfaceDescription, out var counter)){// 将字节每秒转换为千比特每秒 (Kbps)return (counter.NextValue() * 8 / 1024).ToString("F2");}// 如果没有计数器,返回 0.00return "0.00";}
}
代码解释:
NetworkInterfaceInfo
类:用来封装单个网络接口的信息,包括名称、描述、连接类型、IP 地址和接收速率。这样可以方便地将接口信息展示到UI。
NetworkInfoProvider
类:负责初始化和管理网络接口的性能计数器,并提供方法来获取当前活动的网络接口及其相关信息。
构造函数:遍历所有网络接口,仅对处于活动状态(
OperationalStatus.Up
)的接口进行处理。为每个接口创建一个PerformanceCounter
,用于监测接收速率。初次调用NextValue()
是为了初始化计数器值。
GetNetworkInterfaces
方法:返回当前活动网络接口的信息列表。对于每个接口,获取其 IPv4 地址和接收速率。
GetReceiveRate
方法:返回指定接口的接收速率,转换为 Kbps。如果该接口没有计数器,返回 "0.00"。
第二步:创建 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>
第三步:绑定数据
在 MainWindow.xaml.cs
中,从 NetworkInfoProvider
获取数据并绑定到 ListView
。
using System.Windows;
using System.Windows.Threading;
using System.Collections.ObjectModel;// 定义 MainWindow 类,继承自 WPF 的 Window 类
public partial class MainWindow : Window
{// 定义一个 NetworkInfoProvider 实例,用于获取网络接口信息private NetworkInfoProvider provider;// 定义一个可观察的集合,用于存储和更新网络接口信息private ObservableCollection<NetworkInterfaceInfo> networkInterfaces;// MainWindow 构造函数public MainWindow(){// 初始化 XAML 界面组件InitializeComponent();// 初始化 ObservableCollection 实例,并将其绑定到 ListView 控件networkInterfaces = new ObservableCollection<NetworkInterfaceInfo>();NetworkInterfacesListView.ItemsSource = networkInterfaces;// 使用 BackgroundWorker 执行异步初始化,以避免阻塞 UI 线程BackgroundWorker worker = new BackgroundWorker();// 注册 DoWork 事件,用于后台线程执行worker.DoWork += (s, e) => InitializeNetworkProvider();// 注册 RunWorkerCompleted 事件,用于后台线程完成后执行worker.RunWorkerCompleted += (s, e) =>{// 初始化完成后,立即更新界面UpdateNetworkInterfacesImmediately();// 启动定时更新网络接口信息StartUpdating();};// 开始执行后台操作worker.RunWorkerAsync();}// 初始化 NetworkInfoProvider 实例private void InitializeNetworkProvider(){provider = new NetworkInfoProvider();}// 启动定时器,用于定期更新网络接口信息private void StartUpdating(){// 创建调度计时器DispatcherTimer timer = new DispatcherTimer();// 设置定时间隔为2秒timer.Interval = TimeSpan.FromSeconds(2);// 注册定时器的 Tick 事件,用于触发更新操作timer.Tick += UpdateNetworkInterfaces;// 启动定时器timer.Start();}// 立即更新网络接口信息,并更新到界面private void UpdateNetworkInterfacesImmediately(){// 清空当前的网络接口信息networkInterfaces.Clear();// 获取最新的网络接口信息并添加到集合中foreach (var ni in provider.GetNetworkInterfaces()){networkInterfaces.Add(ni);}}// 定期更新网络接口信息的方法private void UpdateNetworkInterfaces(object sender, EventArgs e){// 清空当前的网络接口信息networkInterfaces.Clear();// 获取最新的网络接口信息并添加到集合中foreach (var ni in provider.GetNetworkInterfaces()){networkInterfaces.Add(ni);}}
}
注意事项
- 权限:某些网络接口信息可能需要管理员权限才能访问。
- 更新接口状态:如果需要动态更新网络接口状态,可以使用定时器或事件通知机制。
这个示例展示了一个基础实现,我们可以根据自己的实际需求进一步扩展和美化 UI。
相关文章:
C#应用开发:基于C# WPF界面实现本机网络通讯状态(下载速度)的显示
目录 概述 具体实现 第一步:获取网络接口信息 代码解释: 第二步:创建 WPF 界面 第三步:绑定数据 注意事项 概述 在 WPF 中实现一个界面来显示本机网络接口的状态,通常需要以下几个步骤: 获取网络接口…...

Octo—— 基于80万个机器人轨迹的预训练数据集用于训练通用机器人,可在零次拍摄中解决各种任务
概述 论文地址:https://arxiv.org/abs/2405.12213 在机器人学中,通常使用针对特定机器人或任务收集的数据集来学习策略。然而,这种方法需要为每项任务收集大量数据,由此产生的策略只能实现有限的泛化性能。利用其他机器人和任务的…...
2022高等代数下【南昌大学】
设 ε 1 , ε 2 , ε 3 \varepsilon_1, \varepsilon_2, \varepsilon_3 ε1,ε2,ε3 是复数域上线性空间 V V V 的一组基,线性变换 σ \sigma σ 在 ε 1 , ε 2 , ε 3 \varepsilon_1, \varepsilon_2, \varepsilon_3 ε1,ε2,ε3 下的矩阵为 J = ( 2 0 0 1 2…...
UDP编程
UDP编程是指使用用户数据报协议(UDP)进行网络编程的过程。UDP是一种无连接的传输协议,它不保证数据的可靠性和顺序性。 在UDP编程中,程序可以使用套接字(socket)来进行数据的发送和接收。UDP套接字是一种用…...

论文阅读:Omnidirectional Image Super-resolution via Bi-projection Fusion
对于全景图像(ODIs)的超分辨率的技术有:等矩投影(ERP)但是这个没有利用 ODIs 的独特任何特性。ERP提供了完整的视场但引入了显著的失真,而立方体映射投影(CMP)可以减少失真但视场有限…...

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:智行无忧停车场管理系统(前后端源码 + 数据库 sql 脚本)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 项目介绍 1.1 项目功能 2.0 用户登录功能 3.0 首页界面 4.0 车辆信息管理功能 5.0 停车位管理功能 6.0 入场登记管理功能 7.0 预约管理功能 8.0 收费规则功能 9.0…...
微服务的负载均衡可以通过哪些组件实现
微服务的负载均衡可以通过多种组件来实现,以下是一些常见的负载均衡组件及其特点: Nginx: Nginx是一款轻量级的HTTP和反向代理服务器,也是一个高性能的负载均衡器。它支持多种负载均衡算法,如轮询、加权轮询、IP哈希等…...
Spring Boot 支持哪些云环境?
Spring Boot 对云环境的支持非常广泛,它本身是为云原生应用设计的,能够很好地与多种云平台集成。以下是小编给大家列举的一些 Spring Boot 支持的一些主要云环境: Pivotal Cloud Foundry: Pivotal 是 Spring Boot 的创建者&#x…...

第31天:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测
时间轴: 演示案例: 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 打包器-WebPack-使用&安全 参考:https://mp.weixin.qq.com/s/J3bpy-SsCnQ1lBov1L98WA Webpack 是一个模块打包器。在 Webpack 中会将前端的所有资源…...

word如何快速创建目录?
文章目录 1,先自己写出目录的各级标题。2、选中目标标题,然后给它们编号3、给标题按照个人需求开始分级4、插入域构建目录。4.1、利用快捷键插入域构建目录4.2、手动插入域构建目录 听懂掌声!学会了吗? 前提声明:我在此…...
关于linux 下的中断
1. /proc/irq/<irq_number>/ 下属性详解 在 Linux 系统中,每个中断号(IRQ)都有一个对应的目录 /proc/irq/<irq_number>/,包含与该中断相关的属性文件。这些文件用于查看和配置中断的具体行为。 以下是 /proc/irq/&l…...

两个畸变矩阵相乘后还是一个2*2的矩阵,有四个畸变元素。1、畸变矩阵吸收了法拉第矩阵。2、畸变矩阵也给法拉第旋转角带来模糊(求解有多种可能)
角度一;恢复畸变的时候也把法拉第旋转恢复了 角度二:求解法拉第旋转角的时候 前面乘的复系数的不同也会带来法拉第旋转角和畸变的不同解 注意:无论多少个畸变矩阵相乘,结果都是2*2的矩阵,也就是畸变参数可以减少…...

MCU利用单总线协议(1-wire)读取DHT11温湿度
第1章 硬件连接 硬件原理图 第2章 通讯过程 用户MCU发送一次开始信号,DHT11从低功耗模式转换到高速模式,DHT11等待主机开始信号结束。DHT11等待主机开始信号结束后,DHT11发送响应信号。DHT11发送响应信号后,紧接着送出40bit的数据…...

[保姆式教程]使用目标检测模型YOLO11 OBB进行旋转目标检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)
之前写了一个基于YOLOv8z做旋转目标检测的文章,内容写得不够好,内容也比较杂乱。现如今YOLO已经更新到11了,数据集也集齐了无人机和卫星的农业大棚,所以这次就写一个基于YOLO11 OBB的农业大棚旋转检测。 1. 下载源码配置环境 在h…...

【网络安全】网站常见安全漏洞 - 网站基本组成及漏洞定义
文章目录 引言1. 一个网站的基本构成2. 一些我们经常听到的安全事件3. 网站攻击者及其意图3.1 网站攻击者的类型3.2 攻击者的意图 4. 漏洞的分类4.1 按来源分类4.2 按危害分类4.3 常见漏洞与OWASP Top 10 引言 在当今的数字化时代,安全问题已成为技术领域不可忽视的…...
Redis——个人笔记留存
今日内容 1. redis1. 概念2. 下载安装3. 命令操作1. 数据结构4. 持久化操作5. 使用Java客户端操作redis Redis 1. 概念: redis是一款高性能的NOSQL系列的非关系型数据库 1.1.什么是NOSQLNoSQL(NoSQL Not Only SQL),意即“不仅仅是SQL”,是…...

人工智能_大模型091_大模型工作流001_使用工作流的原因_处理复杂问题_多轮自我反思优化ReAct_COT思维链---人工智能工作笔记0236
# 清理环境信息,与上课内容无关 import os os.environ["LANGCHAIN_PROJECT"] "" os.environ["LANGCHAIN_API_KEY"] "" os.environ["LANGCHAIN_ENDPOINT"] "" os.environ["LANGCHAIN_TRACING_V…...
linux上jdk1.8安装elasticsearch6.8.5踩坑总结
先在windows上下载了elasticsearch8安装成功后,本来是想在linux上也安装一个一样的版本,然后发现各种启动不了,查了一天原来jdk版本不同,需要下载不同版本的elasticsearch,我测试了8,7,6&#x…...
Three.js教程_02场景、相机与渲染器全面解析
Three.js 场景、相机与渲染器全面解析 Three.js 是一个强大的 JavaScript 库,用于在网页上创建和渲染 3D 图形。本文将深入解析 Three.js 中的几个核心概念,并介绍它们的用法及拓展方法。内容包括场景、相机、渲染器、网格对象、光源、坐标轴、控制器和…...

【数据结构】动态规划-基础篇
针对动态规划问题,我总结了以下5步: 确定dp数组以及下标的含义; 递推公式; dp数组如何初始化; 遍历顺序; 打印dp数组(用来debug); 以上5步适用于任何动态规划问题&#x…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...