【C#生态园】打造现代化跨平台应用:深度解析.NET桌面应用工具

选择最适合你的.NET UI框架:全面解析六种热门选择

前言

在现代软件开发中,选择合适的桌面应用框架和UI库对于开发人员来说至关重要。本文将介绍几种流行的.NET桌面应用框架和UI库,包括Eto.Forms、Avalonia、ReactiveUI、MahApps.Metro、MaterialDesignInXAML和Uno Platform。通过对每种工具的核心功能、使用场景、安装与配置以及API概览进行全面介绍,读者将能够更好地了解其特性和适用情况,从而为自己的项目选择合适的工具提供参考。

欢迎订阅专栏:C#生态园

文章目录

  • 选择最适合你的.NET UI框架:全面解析六种热门选择
    • 前言
    • 1. Eto.Forms:一个跨平台的桌面应用框架
      • 1.1 简介
        • 1.1.1 核心功能
        • 1.1.2 使用场景
      • 1.2 安装与配置
        • 1.2.1 安装指南
        • 1.2.2 基本配置
      • 1.3 API 概览
        • 1.3.1 控件创建
        • 1.3.2 事件处理
    • 2. Avalonia:一个跨平台的.NET UI框架
      • 2.1 简介
        • 2.1.1 核心功能
        • 2.1.2 使用场景
      • 2.2 安装与配置
        • 2.2.1 安装方法
        • 2.2.2 基本设置
      • 2.3 API 概览
        • 2.3.1 XAML布局
        • 2.3.2 数据绑定
    • 3. ReactiveUI:一个响应式编程库
      • 3.1 简介
        • 3.1.1 核心功能
        • 3.1.2 使用场景
      • 3.2 安装与配置
        • 3.2.1 安装指南
        • 3.2.2 基本设置
      • 3.3 API 概览
        • 3.3.1 响应式属性
        • 3.3.2 命令绑定
    • 4. MahApps.Metro:一个现代化风格的WPF UI库
      • 4.1 简介
        • 4.1.1 核心功能
        • 4.1.2 使用场景
      • 4.2 安装与配置
        • 4.2.1 安装指导
        • 4.2.2 基本配置
      • 4.3 API 概览
        • 4.3.1 样式定义
        • 4.3.2 控件模板
    • 5. MaterialDesignInXAML:一个Material Design风格的XAML库
      • 5.1 简介
        • 5.1.1 核心功能
        • 5.1.2 使用场景
      • 5.2 安装与配置
        • 5.2.1 安装指南
        • 5.2.2 基本设置
      • 5.3 API 概览
        • 5.3.1 主题设置
        • 5.3.2 控件使用
    • 6. Uno Platform:一个支持跨平台的XAML和C#解决方案
      • 6.1 简介
        • 6.1.1 核心功能
        • 6.1.2 使用场景
      • 6.2 安装与配置
        • 6.2.1 安装指南
        • 6.2.2 基本设置
      • 6.3 API 概览
        • 6.3.1 XAML布局
        • 6.3.2 数据绑定
    • 总结

1. Eto.Forms:一个跨平台的桌面应用框架

Eto.Forms 是一个开源的 .NET 跨平台桌面应用程序框架,可以用于创建跨平台的用户界面。它能够在不同的操作系统上使用本地的用户界面组件,同时提供了简洁、易懂的 API,使得开发者可以轻松地编写可跨平台运行的桌面应用程序。

1.1 简介

1.1.1 核心功能

Eto.Forms 提供了一套统一的 API,用于创建并管理跨平台的用户界面,包括窗体、按钮、文本框、下拉框等各种常见控件。它还支持事件处理、布局管理等功能,让开发者可以专注于应用程序的业务逻辑,而不必过多关注不同平台下的界面实现细节。

1.1.2 使用场景

Eto.Forms 适用于需要同时在 Windows、Mac 和 Linux 等多个操作系统上运行的桌面应用程序。无论是企业应用、工具软件还是个人项目,都可以使用 Eto.Forms 来构建跨平台的用户界面。

1.2 安装与配置

1.2.1 安装指南

通过 NuGet 可以很方便地安装 Eto.Forms。在 Visual Studio 中,打开 NuGet 包管理器控制台,执行以下命令即可安装:

Install-Package Eto.Forms

更多安装方式和更新日志可以参考Eto.Forms 官方网站。

1.2.2 基本配置

在开始使用 Eto.Forms 之前,需要确保已经正确配置了 .NET 开发环境,并且理解了不同平台上的 UI 差异。另外,还需要引入 Eto.Forms 名称空间:

using Eto.Forms;

1.3 API 概览

1.3.1 控件创建

以下是一个简单的示例,演示了如何创建一个窗体并添加一个按钮控件:

using Eto.Forms;public class MyForm : Form
{public MyForm(){Title = "Hello, Eto.Forms!";var button = new Button { Text = "Click me!" };button.Click += (sender, e) => MessageBox.Show("Button Clicked!");Content = button;}
}

在这个示例中,我们创建了一个名为 MyForm 的窗体,并在窗体中添加了一个按钮控件。当按钮被点击时,会弹出一个消息框显示 “Button Clicked!”。

1.3.2 事件处理

Eto.Forms 支持事件处理机制,可以方便地响应用户交互。例如,为按钮的点击事件添加处理方法:

button.Click += (sender, e) => MessageBox.Show("Button Clicked!");

点击按钮时,会弹出一个消息框显示 “Button Clicked!”。

更详细的 API 说明和示例可以参考Eto.Forms 文档。

2. Avalonia:一个跨平台的.NET UI框架

2.1 简介

Avalonia是一个跨平台的开源.NET UI框架,可用于构建现代桌面应用程序。它的设计灵感来自于WPF和Silverlight,旨在提供高性能、可扩展、可定制的用户界面。Avalonia支持XAML布局和数据绑定,使开发者能够快速构建功能丰富、美观的跨平台桌面应用。

2.1.1 核心功能
  • 跨平台支持:Avalonia可以在Windows、Linux和macOS上运行,为开发者提供了更大的目标受众。
  • XAML布局:借助XAML语言,开发者可以轻松创建复杂的用户界面布局。
  • 数据绑定:Avalonia支持强大的数据绑定机制,使UI与数据模型之间的交互变得更加便捷。
2.1.2 使用场景

Avalonia适用于需要构建跨平台桌面应用的开发者,尤其是那些熟悉或已经使用过XAML和.NET技术栈的开发团队。

2.2 安装与配置

2.2.1 安装方法

开发者可以通过NuGet包管理器将Avalonia集成到他们的.NET项目中。具体的安装步骤可以参考Avalonia官方文档。

2.2.2 基本设置

在项目中引用Avalonia库后,通常需要创建一个 AppBuilder 对象并调用 UsePlatformDetect() 方法来启用Avalonia的跨平台支持。以下是一个基本的配置示例:

using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;class Program
{static void Main(string[] args){BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);}public static AppBuilder BuildAvaloniaApp(){return AppBuilder.Configure<App>().UsePlatformDetect().LogToTrace();}
}

2.3 API 概览

2.3.1 XAML布局

Avalonia的XAML布局功能类似于WPF,开发者可以使用XAML定义复杂的UI界面。以下是一个简单的XAML布局示例,其中包含一个按钮和一个文本框:

<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><StackPanel><Button Content="Click Me" Click="ButtonClick"/><TextBox Text="{Binding Path=Name, Mode=TwoWay}"/></StackPanel>
</Window>
2.3.2 数据绑定

Avalonia支持多种数据绑定方式,如单向绑定、双向绑定等。下面是一个简单的数据绑定示例,其中文本框的内容与ViewModel中的属性进行双向绑定:

public class MainViewModel : ViewModelBase
{private string _name;public string Name{get => _name;set => this.RaiseAndSetIfChanged(ref _name, value);}
}// 在窗口代码中设置DataContext
this.DataContext = new MainViewModel();

更多关于Avalonia的API和使用方法,请参考Avalonia官方文档。

3. ReactiveUI:一个响应式编程库

ReactiveUI 是一个基于响应式编程原理的桌面应用框架,它提供了一种优雅的方��来处理用户界面和状态变化。通过结合响应式编程和 MVVM 模式,ReactiveUI 可以使得开发人员更容易地构建具有高度交互性和可维护性的桌面应用程序。

3.1 简介

3.1.1 核心功能

ReactiveUI 的核心功能包括:

  • 提供了一组响应式属性和命令绑定,简化了用户界面元素与数据模型之间的交互。
  • 支持异步编程模式,使得处理任务和事件变得更加便捷和灵活。
  • 提供了强大的路由机制,能够很好地处理导航和页面切换。
3.1.2 使用场景

ReactiveUI 适用于需要构建高度交互性、实时更新的桌面应用程序,尤其是需要处理复杂用户界面和数据流的场景。

3.2 安装与配置

3.2.1 安装指南

你可以通过 NuGet 来安装 ReactiveUI 包,以下为在 Visual Studio 中如何安装:

PM> Install-Package ReactiveUI

更多关于安装指南的信息可以参考 ReactiveUI 官方文档

3.2.2 基本设置

在使用 ReactiveUI 之前,需要进行一些基本设置,比如在应用程序启动时初始化 ReactiveUI:

public partial class App : Application
{public App(){this.InitializeReactiveUI();}
}

更多关于基本设置的内容可以参考 ReactiveUI 官方文档

3.3 API 概览

3.3.1 响应式属性

ReactiveUI 提供了一组便捷的 API 来创建和管理响应式属性。下面是一个简单的例子:

private string _name;
public string Name
{get => this._name;set => this.RaiseAndSetIfChanged(ref this._name, value);
}

以上代码演示了如何定义一个响应式属性 Name,并且使用 this.RaiseAndSetIfChanged 方法来通知属性值的变化。

更多关于响应式属性的API可以参考 ReactiveUI 属性绑定

3.3.2 命令绑定

ReactiveUI 也提供了便捷的 API 来实现命令绑定,以下是一个简单的例子:

public ReactiveCommand<Unit, Unit> GreetUser { get; }// 在构造函数中初始化命令
this.GreetUser = ReactiveCommand.CreateFromTask(async () =>
{await this._dialogService.ShowMessage("Hello, " + this.Name);
});

以上代码演示了如何定义一个命令 GreetUser 并通过 ReactiveCommand.CreateFromTask 来指定命令执行的异步操作。

更多关于命令绑定的 API 可以参考 ReactiveUI 命令绑定

通过上述示例,我们对 ReactiveUI 这个响应式编程库有了初步的了解。希望这篇文章对你有所帮助!

4. MahApps.Metro:一个现代化风格的WPF UI库

MahApps.Metro 是一个流行的开源桌面应用程序框架,它为 WPF 应用程序提供了现代化的用户界面设计和丰富的控件样式。通过 MahApps.Metro,开发人员可以轻松地为他们的应用程序添加漂亮的外观和新颖的交互功能。

4.1 简介

4.1.1 核心功能

MahApps.Metro 提供了丰富的现代化 UI 控件和样式,包括各种按钮、输入框、消息框、菜单等,同时还支持主题定制和国际化。此外,MahApps.Metro 还提供了一些实用的扩展功能,如窗口拖动、命令绑定等,以简化开发过程。

4.1.2 使用场景

MahApps.Metro 可以被广泛应用于需要现代化界面设计的 WPF 桌面应用程序中,尤其适合于企业内部管理系统、工具类软件等。

4.2 安装与配置

4.2.1 安装指导

首先,在 Visual Studio 中创建一个 WPF 项目。然后,在 NuGet 包管理器中搜索并安装 MahApps.Metro 包。

Install-Package MahApps.Metro
4.2.2 基本配置

在 App.xaml 文件中添加以下代码,引入 MahApps.Metro 主题:

<Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" /><ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" /><ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" /></ResourceDictionary.MergedDictionaries></ResourceDictionary>
</Application.Resources>

4.3 API 概览

4.3.1 样式定义

MahApps.Metro 提供了一系列精美的控件样式定义,例如按钮、文本框、下拉列表等。开发者可以通过简单的 XAML 代码或者 C# 代码来使用这些样式。

<Button Style="{StaticResource MetroButton}" Content="Click Me" />

或者在 C# 代码中使用:

var button = new Button();
button.Style = FindResource("MetroButton") as Style;

更多样式定义,请参考 MahApps.Metro Styles。

4.3.2 控件模板

MahApps.Metro 还提供了丰富的控件模板,开发者可以根据自己的需求对控件的外观和交互行为进行定制。

<controls:TextBox Template="{StaticResource MetroTextBox}" />

或者在代码中应用模板:

var textBox = new TextBox();
textBox.Template = FindResource("MetroTextBox") as ControlTemplate;

有关更多控件模板的信息,请查看 MahApps.Metro Control Templates。

5. MaterialDesignInXAML:一个Material Design风格的XAML库

MaterialDesignInXAML是一个用于创建Material Design风格桌面应用的开源XAML库。它提供了一系列的控件和主题,可以帮助开发者快速构建现代化、美观的桌面应用程序。

5.1 简介

5.1.1 核心功能

MaterialDesignInXAML提供了丰富的Material Design风格控件,包括按钮、文本框、进度条等。同时,它还支持自定义主题,让开发者可以轻松实现应用程序的个性化定制。

5.1.2 使用场景

适用于需要在WPF应用中使用Material Design风格的开发者,尤其是那些希望快速搭建现代化界面的人群。

5.2 安装与配置

5.2.1 安装指南

首先,在Visual Studio中创建一个新的WPF项目。然后,可以通过NuGet包管理器来安装MaterialDesignInXAML。在NuGet包管理器控制台中执行以下命令:

Install-Package MaterialDesignThemes
5.2.2 基本设置

在WPF项目中,可以通过引入MaterialDesign的命名空间来使用其提供的控件和样式。在XAML文件中,可以通过下面的方式引入:

xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"

5.3 API 概览

5.3.1 主题设置

MaterialDesignInXAML允许开发者通过修改主题颜色、字体大小等来自定义应用程序的外观。以下是一个示例,演示如何设置主题为深色:

var paletteHelper = new PaletteHelper();
var theme = paletteHelper.GetTheme();
theme.SetBaseTheme(Theme.Dark);
paletteHelper.SetTheme(theme);

更多关于主题设置的信息,请参考官方文档

5.3.2 控件使用

MaterialDesignInXAML提供了丰富的Material Design控件,例如按钮、文本框和进度条等。以下是一个简单的示例,展示如何使用Material Design风格的按钮:

<Button Style="{StaticResource MaterialDesignRaisedButton}" Content="Save" />

官方文档中还提供了更加详细的控件使用说明,可以通过这里找到更多信息。

以上是MaterialDesignInXAML库的简要介绍和基本使用方法,希望对您有所帮助。

6. Uno Platform:一个支持跨平台的XAML和C#解决方案

6.1 简介

Uno Platform 是一个支持使用 XAML 和 C# 跨平台开发的解决方案。它允许开发人员使用单一的代码库来构建适用于多个平台的应用程序,包括 iOS、Android、Windows 和 Web。

6.1.1 核心功能

Uno Platform 的核心功能包括跨平台的 XAML 布局系统和强大的数据绑定机制。开发人员可以使用熟悉的工具和语言来构建原生级别的用户界面,并实现数据模型与视图之间的无缝连接。

6.1.2 使用场景

Uno Platform 适用于需要在多个平台上构建一致性用户体验的项目。开发人员可以通过 Uno Platform 实现代码重用,并最大限度地减少针对不同平台的定制化开发工作量。

6.2 安装与配置

6.2.1 安装指南

要开始使用 Uno Platform,首先需要安装 Visual Studio 2019 或更高版本,并安装 Uno Platform 的 Visual Studio 插件。安装完成后,即可创建 Uno Platform 项目。

安装 Uno Platform 插件:

Extensions -> Manage Extensions -> Online -> Search for "Uno Platform" -> Install
6.2.2 基本设置

在 Visual Studio 中创建 Uno Platform 项目后,需要根据目标平台进行适当的配置。例如,对于 Android 平台,需要确保已经配置了正确的 Android 开发环境和模拟器。

6.3 API 概览

6.3.1 XAML布局

Uno Platform 的 XAML 布局系统类似于 UWP(Universal Windows Platform),支持使用标签和属性定义用户界面元素的布局和外观。

<Grid><TextBlock Text="Hello, Uno Platform!" />
</Grid>

官网链接:Uno Platform - XAML

6.3.2 数据绑定

Uno Platform 支持使用 C# 代码进行数据绑定,实现数据模型与视图之间的自动更新。

public class Person : INotifyPropertyChanged
{private string _name;public string Name{get { return _name; }set{if (_name != value){_name = value;RaisePropertyChanged(nameof(Name));}}}public event PropertyChangedEventHandler PropertyChanged;protected void RaisePropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}

官网链接:Uno Platform - Data Binding

总结

通过本文的介绍,我们对多个.NET桌面应用框架和UI库有了全面的了解。Eto.Forms提供跨平台的桌面应用开发解决方案,Avalonia则专注于.NET UI框架的跨平台实现。ReactiveUI支持响应式编程,MahApps.Metro和MaterialDesignInXAML则分别提供现代化风格和Material Design风格的UI组件。Uno Platform则是一个支持跨平台的XAML和C#解决方案。通过比较和总结,我们可以根据项目需求选取最适合的工具,以提升开发效率和用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/439856.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个真实可用的登录界面!

需要工具&#xff1a; MySQL数据库、vscode上的php插件PHP Server等 项目结构&#xff1a; login | --backend | --database.sql |--login.php |--welcome.php |--index.html |--script.js |--style.css 项目开展 index.html&#xff1a; 首先需要一个静态网页&#x…

机器学习(5):机器学习项目步骤(二)——收集数据与预处理

1. 数据收集与预处理的任务&#xff1f; 为机器学习模型提供好的“燃料” 2. 数据收集与预处理的分步骤&#xff1f; 收集数据-->数据可视化-->数据清洗-->特征工程-->构建特征集和数据集-->拆分数据集、验证集和测试集 3. 数据可视化工作&#xff1f; a. 作用&…

基于SpringBoot+Vue的在线投票系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

JDBC 概述

JDBC 概述 JDBC的基本概念与功能JDBC的工作原理JDBC的组件与类JDBC的类型与特性JDBC的应用场景 JDBC&#xff08;Java Database Connectivity&#xff09;即Java数据库连接&#xff0c;是Java编程语言用于与数据库进行连接和操作的API&#xff08;应用程序编程接口&#xff09;…

C++面试速通宝典——7

150. 数据库连接池的作用 数据库连接池的作用包括以下几个方面&#xff1a; 资源重用&#xff1a;连接池允许多个客户端共享有限的数据库连接&#xff0c;减少频繁创建和销毁连接的开销&#xff0c;从而提高资源的利用率。 统一的连接管理&#xff1a;连接池集中管理数据库连…

python交互式命令时如何清除

在交互模式中使用Python&#xff0c;如果要清屏&#xff0c;可以import os&#xff0c;通过os.system()来调用系统命令clear或者cls来实现清屏。 [python] view plain copy print? >>> import os >>> os.system(clear) 但是此时shell中的状态是&#xff1a;…

Java 面向对象设计一口气讲完![]~( ̄▽ ̄)~*(上)

目录 Java 类实例 Java面向对象设计 - Java类实例 null引用类型 访问类的字段的点表示法 字段的默认初始化 Java 访问级别 Java面向对象设计 - Java访问级别 Java 导入 Java面向对象设计 - Java导入 单类型导入声明 按需导入声明 静态导入声明 例子 Java 方法 J…

msvcp140.dll丢失的解决方法,详细解读6种解决方法

在使用电脑时&#xff0c;我们可能会遇到提示缺少msvcp140.dll的错误信息。这个提示意味着我们的电脑中缺少MSVCP140.dll这个文件&#xff0c;它是某些程序运行所必需的。如果我们遇到这个问题&#xff0c;应该如何解决呢&#xff1f;本文将详细解析如何解决msvcp140.dll丢失的…

Study-Oracle-10-ORALCE19C-RAC集群搭建

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。 ORACLE --RAC 搭建理念:准备工作要仔细,每个参数及配置都到仔细核对。环境准备完成后,剩下的就是图像化操作,没啥难度,所以图形化操作偷懒不续写了。 一、硬件信息及配套软件 1、硬件设置 RAC…

springboot系列--web相关知识探索二

一、映射 指的是与请求处理方法关联的URL路径&#xff0c;通过在Spring MVC的控制器类&#xff08;使用RestController注解修饰的类&#xff09;上使用注解&#xff08;如 RequestMapping、GetMapping&#xff09;来指定请求映射路径&#xff0c;可以将不同的HTTP请求映射到相应…

【React】事件机制

事件机制 react 基于浏览器的事件机制自身实现了一套事件机制&#xff0c;称为合成事件。比如&#xff1a;onclick -> onClick 获取原生事件&#xff1a;e.nativeEvent onClick 并不会将事件代理函数绑定到真实的 DOM节点上&#xff0c;而是将所有的事件绑定到结构的最外层…

Mysql数据库约束

前言 数据库是用户数据的最后一道保护屏障&#xff0c;所以数据库存在大量的约束&#xff0c;保证数据库中数据的完整性和可预期性。数据库中&#xff0c;数据类型本身就是一种约束&#xff0c;除此在外还有&#xff1a; null/not null&#xff0c;default&#xff0c; comment…

【大模型 AI 学习】大模型 AI 部署硬件配置方案(本地硬件配置 | 在线GPU)

最近想部署一个开源深度学习项目&#xff0c;但是小编的笔记本电脑是8G的集成显存&#xff0c;且没有GPU&#xff0c;性能肯定是不够的。于是小编在小po站上粗浅了解了一下当前: 1. 大模型 AI本地硬件配置和 2. 云上申请GPU算力的两种方式。简单记录一下&#xff1a; 参考视频…

openEuler 24.03 (LTS) 部署 K8s(v1.31.1) 高可用集群(Kubespray Ansible 方式)

写在前面 实验需要一个 CNI 为 flannel 的 K8s 集群之前有一个 calico 的版本有些旧了,所以国庆部署了一个v1.31.1 版本 3 * master 5 * work时间关系直接用的工具 kubespray博文内容为部署过程以及一些躺坑分享需要科学上网理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99…

Android2024.2.1升级错误

提示 Gradle 版本不兼容&#xff0c;升级后就报错了 。 1.gradle安装包镜像 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists //distributionUrlhttps\://services.gradle.org/distributions/gradle-8.5-bin.zip distributionUrlhttps://mirrors.cloud.tencen…

一个月学会Java 第2天 认识类与对象

Day2 认识类与对象 第一章 初识类 经过一个程序的编写&#xff0c;应该对程序的结构有点好奇了吧&#xff0c;如果你有基础&#xff0c;接下来的肯定非常的易懂&#xff0c;如果你没有基础也没有关系&#xff0c;反复琢磨一下也就懂了&#x1f606; 我们来重复一下第一个程序 …

Pikachu-unsafe upfileupload-getimagesize

什么是getimagesize()&#xff1f; getimagesize()是PHP中用于获取图像的大小和格式的函数。它可以返回一个包含图像的宽度、高度、类型和MIME类型的数组。 由于返回的这个类型可以被伪造&#xff0c;如果用这个函数来获取图片类型&#xff0c;从而判断是否时图片的话&#xff…

4.资源《Arduino UNO R3 proteus 电机PID参数整定工程文件(含驱动代码)》说明。

资源链接&#xff1a; Arduino UNO R3 proteus 电机PID参数整定工程文件&#xff08;含驱动代码&#xff09; 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;proteus工程&#xff0c;内含设计图和工程代码。 3.内容展示 4.简述 工程功能可以看这个视频 PID仿真调…

Graphiti:如何让构建知识图谱变得更快、更具动态性?

扩展大语言模型数据提取&#xff1a;挑战、设计决策与解决方案 Graphiti 是一个用于构建和查询动态、时间感知的知识图谱的 Python 库。它可以用于建模复杂、不断演变的数据集&#xff0c;并确保 AI 智能体能够访问它们完成非平凡任务所需的数据。它是一个强大的工具&#xff…

java将word转pdf

总结 建议使用aspose-words转pdf,poi的容易出问题还丑… poi的(多行的下边框就不对了) aspose-words的(基本和word一样) poi工具转换 <!-- 处理PDF --><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres…