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…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
