当前位置: 首页 > news >正文

一个 Blazor/WinForm 开发者的 WPF 学习记:通往 Avalonia 的那条路

一个 Blazor/WinForm 开发者的 WPF 学习记:通往 Avalonia 的那条路

写在前面

做了几年 Blazor 和 WinForm,本来以为桌面端这件事就这么过去了。直到我认真考虑跨平台桌面方案,才发现绕不开 Avalonia。而要真正用好 Avalonia,最好先补 WPF 这一课。这篇文章不是教程,更多是把我这段时间学习、踩坑、修坑的经历写下来,也顺便记录一下我在做 Shadcn.Wpf 组件库时的一些实践和思考。

为什么先回头学 WPF

如果目标是 Avalonia,WPF 是最顺的那条路。原因很简单:

  • 概念对齐:依赖属性、绑定、样式/模板、资源体系这些核心机制在两个框架里几乎是一脉相承。
  • 生态积累:WPF 的资料和讨论太多了,遇到问题有地方查,有思路参考。
  • 练手空间:先在 WPF 把设计和交互跑通,可以更从容地迁到 Avalonia。

WPF 的价值与现实

接触下来,我对 WPF 的感受更具体了。它的可塑性很强,MVVM 和数据绑定的模型经得住考验,动画、图形也够用。与此同时,它只跑 Windows、概念不算轻、绑定/样式的调试有门槛,生态偏老。优点让人愿意深入,局限性也必须接受。

学习路上的几个坎

XAML 不只是一堆标签

第一次系统写 XAML,会发现它不是“写点标记再加点样式”这么简单。它把结构、样式、交互、动画都揉在一起,需要有整体的心智模型。比如下面看着简单,背后其实牵扯依赖属性、绑定、命令、自定义控件等一堆机制:

<controls:ShadcnButtonContent="点击我"Variant="Primary"Size="Default"IsLoading="{Binding IsProcessing}"Command="{Binding ProcessCommand}" />

一开始我也觉得“这不就是一个按钮吗”,真正去实现之后才明白每一个点都需要打扎实。

绑定调试:别和黑盒较劲

从 WinForm 的事件流转到 WPF 的数据绑定,最大的不适应是“静默失败”。绑定错了,界面不报错,只有输出窗口会嘀咕两句。实用的做法有三个:

  • 开启绑定跟踪:
<TextBlock Text="{Binding UserName, diag:PresentationTraceSources.TraceLevel=High}" />
  • 用 Snoop 或同类工具看可视化树、DataContext、实时值。
  • 盯输出窗口。很多“看不见的错误”其实都在那儿写得清清楚楚。

样式与模板:强,但要敬畏

WPF 的样式系统不像 CSS 那么“轻”,但它的表达力很强。一个按钮,如果你要完全控制视觉和交互,确实需要写模板。刚上手会觉得啰嗦,过了临界点之后会发现它其实很可控:

<Style x:Key="ShadcnButtonStyle" TargetType="Button"><Setter Property="Background" Value="{DynamicResource PrimaryBrush}" /><Setter Property="Foreground" Value="{DynamicResource PrimaryForegroundBrush}" /><Setter Property="Padding" Value="12,8" /><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="Button"><Border Background="{TemplateBinding Background}"CornerRadius="6"><ContentPresenter HorizontalAlignment="Center"VerticalAlignment="Center" /></Border><ControlTemplate.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="Background" Value="{DynamicResource PrimaryHoverBrush}" /></Trigger><Trigger Property="IsPressed" Value="True"><Setter Property="Background" Value="{DynamicResource PrimaryActiveBrush}" /></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter>
</Style>

依赖属性:踩过的坑和读懂的门道

依赖属性是 WPF 的地基,理解它,很多问题就顺了。最常见的困惑来自“值的优先级”。我曾经为了一个样式不生效查了很久,最后发现是自己在代码里先给控件打了“本地值”:

// 本地值优先级更高,会压住样式和触发器
button.Background = Brushes.Red;

另外两个坑也值得提:

  • 变化回调里不要反向设置自身,容易造成循环。
private static void OnVariantChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{if (d is ShadcnButton b){// 不要在回调里直接给 Variant 重新赋值b.UpdateVisualState();}
}
  • 线程上下文要严谨。依赖属性属于 UI 线程,不要在后台线程直接改。
// 错误:后台线程直接设置
Task.Run(() => button.IsLoading = true);// 正确:通过 Dispatcher 回到 UI 线程
Task.Run(() =>
{button.Dispatcher.Invoke(() => button.IsLoading = true);
});

动画:从“跑起来”到“别跨线程”

做加载态动画时,我把不透明度、旋转、缩放放在一个 Storyboard 里,写出来不复杂,但要注意线程模型。Storyboard 涉及 UI 对象,跨线程使用会抛异常。稳定的做法:

  • 保证创建、启动动画都在 UI 线程:
Dispatcher.Invoke(() =>
{var storyboard = (Storyboard)FindResource("LoadingAnimation");storyboard.Begin(this);
});
  • 能不用 TargetName 就不用,尽量只用 TargetProperty,以减少对具体元素的硬引用。
  • 需要跨线程“构造再用”的场景,确保对象可冻结,但大多数情况下还是在 UI 线程里创建/启动最省心。

样式继承:和 CSS 那点不同

如果你熟悉 CSS,会下意识期待“层叠”和“合并”。WPF 的样式更像“显式继承”。想继承,写 BasedOn;同名属性是覆盖不是合并:

<Style x:Key="BaseButtonStyle" TargetType="Button"><Setter Property="Margin" Value="5,5,5,5" />
</Style><Style x:Key="PrimaryButtonStyle"TargetType="Button"BasedOn="{StaticResource BaseButtonStyle}"><!-- 这里会完全替换 Base 的 Margin,而不是合并 --><Setter Property="Margin" Value="10,0,10,0" /><Setter Property="Background" Value="Blue" />
</Style>

这一点在设计“基类样式/主题样式”时要有意识地规划,避免出现“为什么没叠起来”的错觉。

选型与迁移:WPF、MAUI、Avalonia

我也认真比较过主流方案。Electron/Blazor Hybrid 上手快,但桌面端的体验和资源占用我不太满意;MAUI 的“原生外观”在跨平台一致性上要费不少力气;Avalonia 的优势在于一致的跨平台 UI 和接近 WPF 的开发体验,这对我来说是最关键的。最终我决定:就像学 Blazor 之前要学 HTML/JS/CSS 三大件一样,用 WPF 把体系打牢,再走到 Avalonia。

从 WPF 到 Avalonia,能直接迁移的有:

  • XAML 语法、绑定、MVVM 思路
  • 样式/模板/资源的组织方式
  • 依赖属性的心智模型(在 Avalonia 里叫 StyledProperty)

需要适配的主要是控件差异、渲染机制和一些平台相关 API,但思路不会变。

实战中的难点

性能

复杂列表如果不用虚拟化,卡顿是必然的。能虚拟化就虚拟化,能简化模板就简化。

<ListView ItemsSource="{Binding LargeDataSet}"VirtualizingPanel.IsVirtualizing="True"VirtualizingPanel.VirtualizationMode="Recycling"><ListView.ItemTemplate><DataTemplate><!-- 模板尽量轻 --><TextBlock Text="{Binding Name}" /></DataTemplate></ListView.ItemTemplate>
</ListView>

调试

  • 绑定:输出窗口 + 诊断跟踪 + Snoop。
  • 样式/模板:从外到内逐层排查,先确认资源是否能解析,再看触发器条件是否成立。
  • 性能:找“成片的复杂视觉树”和“高频绑定计算”,对症下药。

生态

能用的东西不少,但的确偏“传统”。我的做法是把工具链尽量现代化,比如用更顺手的 XAML 分析/重构工具,自己补一点项目模板和脚本,把日常工作拉顺。

这段学习带给我的

最大的收获不是学会了多少 API,而是心智模型的转变:从命令式到声明式,从“写控件”到“设计系统”。在做 Shadcn.Wpf 的过程中,我开始更关注样式系统、状态管理、可组合性和一致性,这些后来都会直接影响到 Avalonia 的实现。

下一步:把 Shadcn.Wpf 带到 Avalonia

我的计划很简单:

  • 先迁核心概念和基础组件,保证视觉/交互一致。
  • 再补平台差异和性能优化,建立一套可复用的主题与样式规范。
  • 在真实项目里迭代,把实践经验再反哺到组件库。

尾声

WPF 不新,但底层理念依然很耐用。它帮我把 Avalonia 这条路看得更清楚,也让我在桌面 UI 的“系统设计”上更有把握。写这篇文章是想把一些踩坑细节留下来:遇到的问题、调试的手法、做设计时的取舍。如果你正打算从 Web 或 WinForm 转向跨平台桌面,希望这些经历能少让你走几步弯路。愿我们都能在下一次重构时,写得更稳、改得更从容。

相关文章:

一个 Blazor/WinForm 开发者的 WPF 学习记:通往 Avalonia 的那条路

一个 Blazor/WinForm 开发者的 WPF 学习记:通往 Avalonia 的那条路 写在前面 做了几年 Blazor 和 WinForm,本来以为桌面端这件事就这么过去了。直到我认真考虑跨平台桌面方案,才发现绕不开 Avalonia。而要真正用好 Avalonia,最好先补 WPF 这一课。这篇文章不是教程,更多是…...

VulkanAPI细节梳理2

// --- 创建渲染通行证(支持多视图和深度缓冲) ---std::vector<VkAttachmentDescription> attachments(2);// 颜色附件attachments[0].format = format;attachments[0].samples = VK_SAMPLE_COUNT_1_BIT;attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;attachme…...

React 状态丢失:组件 key 用错引发的渲染异常 - 指南

React 状态丢失:组件 key 用错引发的渲染异常 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monos…...

快速实现 Excel 表格转 SVG:Java 教程 - E

如果你曾尝试过把 Excel 表格导出为 SVG 图片,就会发现 Excel 本身并不支持这种格式。虽然市面上存在一些在线转换工具,但上传文件存在效率与安全方面的顾虑。对于开发者来说,使用 Java 来实现 Excel 到 SVG 的转换,是一种更灵活、可控的方式。本文将演示如何通过简单的 Ja…...

绕过文件上传限制实现客户端路径遍历漏洞利用的技术解析

本文详细解析了如何通过精心构造JSON文件绕过PDF和图像上传验证机制,利用mmmagic、pdflib和file命令的检测特性实现客户端路径遍历攻击的技术方法与实战案例。绕过文件上传限制实现客户端路径遍历漏洞利用 在我之前的博客文章中,我演示了如何利用JSON文件作为客户端路径遍历(…...

事件总线之初步学习

第一步:创建一个eventBus.js 文件名可根据个人爱好取名即可; 内容:import Vue from vue const eventBus = new Vue(); export default eventBus;第二步:使用import EventBus from @/common/eventBus;//监听全局事件clear-login-interval EventBus.$on(clear-login-interva…...

Markdown Day04

常用DOS命令 ##查看当前目录下所有文件dir ##切换目录cd change directory ##cd..回到上一个 ##清理屏幕cls ##退出exit ##查看电脑IP,ipconfig ##打开应用 calc notepad mspaint ##ping 命令 ping www.baidu.com ##文件操作 ad 创建目录 cd> 新增文件 del 删除文件 rd 移…...

C++中类的内存存储

目录类类对象的非虚成员函数类的成员变量空类对象具有虚函数的类对象 类 类本身不会存储在内存中,类实例化的对象才会保存在内存中。但是使用 sizeof 计算类大小时能得到结果,这是因为 sizeof 会在编译时就得到类型信息,这只与类的布局有关。 类对象的非虚成员函数 考虑如下…...

PyTorch 优化器(Optimizer)

优化器(Optimizer)是深度学习训练过程中用于更新模型参数的核心组件。在训练神经网络时,我们需要通过反向传播计算损失函数相对于模型参数的梯度,然后使用优化器根据这些梯度来更新参数,以最小化损失函数。PyTorch 优化器(Optimizer)技术指南 目录优化器概念 常用优化器…...

实用指南:域名市场中,如何确认域名的价值

实用指南:域名市场中,如何确认域名的价值pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...

初步了解Neo4j

1. 是什么? Neo4j 是一个原生图数据库。它与我们熟悉的关系型数据库(如 MySQL, PostgreSQL)和 NoSQL 数据库(如 MongoDB)有根本性的不同,因为它专门为存储和查询数据之间的关系而设计。 它的核心哲学是:“关系即一等公民”。这意味着关系(或连接)和数据本身同等重要,…...

多模态和语音 AI 年度收官大会,把握 2026 技术风向标!

如果今年只参加一场多模态和语音 AI 大会,来 Convo AI & RTE2025 就够了。你是否好奇:1⃣从端到端语音模型和全双工技术,未来音频还将有哪些突破方向?2⃣如何挖掘端侧 AI 潜能,定义下一代智能硬件终端?3⃣从主动智能体到可交互世界模型,实时多模态 AI 将驱动怎样的未…...

做题

P4159 [SCOI2009] 迷路 矩阵快速幂优化递推。 首先最暴力的想法,设 $ f_{i,j} $ 在 $ j $ 时刻,到达点 $ i $ 的种类数。 枚举时间和 $ i $,然后 $ f_{i,j} = \sum\limits_{k=1}^n {f_{k,j-w[i][k]}} $。 时间很大,所以肯定行不通。 这样显然是不能用矩阵来优化的。 考虑拆…...

解码C语言函数

一、函数基本概念 1.1 函数定义 概念:把一个功能的实现流程封装起来,使用户留下接口进行调用 作用:参数创建该功能进行封装操作,返回值即通过功能显示的产出 1.2 函数组成要素返回值类型:根据函数功能而定,需要在函数头中指定子程序类的返回值类型 参数名:在函数体中提取…...

SchemaStore

Hello World本文来自博客园,作者:南宫影,转载请注明原文链接:https://www.cnblogs.com/nangongying/p/19100468...

XSS攻击防御

目录背景和价值为什么需要输出编码?不同场景下的编码方式(白话版)1. 最常见场景:内容显示在HTML标签里(比如<div>、<span>中)2. 特殊场景:内容显示在HTML标签的属性里(比如value、href中)3. 特殊场景:内容要在JavaScript代码里使用4. 特殊场景:内容作为…...

imes开发部署

一.git地址下载源码 二.后端设置 1.增加配置文件:ktg-admin/src/main/resources/application-test.yml2.临时修改代码:ktg-mes/src/main/java/com/ktg/mes/task/MesTask.java,如图注释2行。 3.快捷键Ctrl+Alt+Shift+S,打开项目结构(Project Structure)对话框4.编辑配置5…...

思维题做题记录-1

CF2600左右有趣的思维题做题记录-1 CF1458C. Latin Square 考虑将原矩阵写成 \(n\times n\) 个限制形如 \((i,j,a_{i,j})\),那么所有操作就是对这些限制进行的修改:对于 UD 操作相当于将限制改为 \((i\mp 1,j,a_{i,j})\)。 对于 LR 操作相当于将限制改为 \((i,j\mp 1,a_{i,j}…...

如何在极短时间内通透一个大型开源项目

如何在极短时间内通透一个大型开源项目前言 在现代软件开发中,快速理解和掌握大型开源项目是一项至关重要的技能。无论是参与开源贡献、技术选型,还是学习先进架构模式,都需要我们具备高效解读项目的能力。本文将以 OpenDeepWiki 项目为例,深入剖析如何运用AI技术快速通透一…...

求 Ray Ping - Gon

rt(跟风...

LCT学习笔记

LCT学习笔记从例题开始: P3690 【模板】动态树(LCT) 对于一棵静态的树,常见方法是树剖然后走链,但是在动态的情况下常见的重链或长链就会很慢,因为修改连边情况后就不满足性质了 引入一个新的方法:实链剖分,对于一个节点,任选一个儿子,连边为实边,其余为虚边,注意这…...

Visual Studio 2026 Insiders 重磅发布:AI 深度集成、性能飞跃、全新设计

近日,微软正式发布 Visual Studio 2026 Insiders!这是迄今为止 Visual StudioE 极具跨越式的一次升级。新版本不仅将 AI 深度融入开发工作流,还带来了企业级性能的显著提升,以及更轻盈、现代的界面设计,全面提升开发体验。近日,微软正式发布 Visual Studio 2026 Insiders…...

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-29- 操作单选和多选按钮 - 下篇(详细教程) - 北京

1.简介 我们可能会遇到一直测试单选和复选按钮的测试场景,如果就十几道选择题,那就手工点击,马上完事,但是如果是让你测试题库呢?那不得那鼠标点击冒烟了,手指点到抽筋了。尤其是做教育类的软件测试,这些就是家常便饭了。因此今天这一篇宏哥主要是讲解一下,如何使用Pla…...

自定义注解实现服务分处理-策略模式

路由:请求标识→匹配 Service→调用 process 方法 通过自定义注解 @BusinessServiceMapping 标记具体业务 Service,注解值(如 DC 代表客户、ORD 代表订单)与请求参数中的业务标识关联;再通过 Spring 容器扫描 + 策略模式,实现 “请求标识→匹配 Service→调用 process 方…...

iOS26正式版全新风格!一文汇总实用新功能!

苹果在9月17日凌晨正式推送了iOS26系统更新,这次版本更新带来了多达61项新功能与优化。经过9个Beta版和近100天的测试,iOS26正式版终于与用户见面,版本号为23A340,更新包大小约8GB。 iOS26不仅在设计语言上焕然一新,更在AI能力、交互体验和隐私保护等多个维度进行了全面升…...

远程控制应用的中的全球节点功能如何开启?插件类型、并发数量怎么选?

不知道大家使用远程控制应用进行跨系统跨设备操作主要都是针对哪些场景呐?其实对于很多需要跨境远程办公的人群或进行售后设备升级管理的朋友来说无疑是必不可少的,甚至于海外学子们来说同样也至关重要,毕竟总有需要协助国内亲友处理问题的时刻,代操作远高于语音指导的效率…...

借助Aspose.HTML控件,使用 Python 将 HTML 转换为 DOCX

Aspose.HTML for Python via .NET提供了用于自动执行文件格式转换任务的类和方法。此外,它能够精确地转换 HTML 结构和样式,是 Python 开发人员的理想选择。本教程将向开发者展示如何在 Python 中以编程方式将HTML转换为DOCX。我们将使用一个非常快速的 Python SDK 将网页转换…...

openEuler 24.03 (LTS-SP2)安装mysql 8.0.41

环境:OS:openEuler 24.03 (LTS-SP2)(安装时候没有图形界面的选择项可选)mysql:8.0.41 glib.2.17 操作系统下载https://www.openeuler.org/en/download/#openEuler%2024.03%20LTS%20SP2查看系统glibc版本[root@localhost soft]# ldd --versionldd (GNU libc) 2.38Copyright (C) …...

7.数据库归档异常检查与处理

备库: select instance_name,status from v$instance; select open_mode from v$database; @dgstat 如果都是00:00:00则说明本地从生产到DR同步没有问题 @dgpro 与上面的RFS的sequence#进行对比,可以算出生产与DR相差的sequence Block# 1分钟前是852100,1分钟后是856100,…...

Gitlab 关键字

核心原则:一切路径始于项目根目录:https://blog.csdn.net/qq_14829643/article/details/150773286include: local:中的所有路径都是相对于当前项目的根目录进行解析的。它既不是传统意义上的“绝对路径”(如 /etc/gitlab-runner/config.toml,这会指向 Runner 服务器的文件…...

8.listener日志占用过大处理方法

ps -ef |grep tns asmenv 查询listener.log的位置路径 lsnrctl status [listener name] 例如: listener log file : /oracle/TEST/diag/tnslsnr/xianigux/listener/alert/log.xml cd /oracle/TEST/diag/tnslsnr/xianigux/listener/alert 删除除了log.xml以外的所有xml文件 rm …...

马建仓AI助手完成全链路升级:三十余项新能力重塑研发工作流

马建仓AI助手完成全链路升级:三十余项新能力重塑研发工作流 在数字化转型浪潮席卷各行各业的当下,研发效率正成为企业竞争力的关键指标。马建仓AI助手近日宣布完成面向真实研发流程的全面升级,新增三十余项智能能力,覆盖需求、开发、测试、项目管理等关键环节,标志着企业级…...

线性回归与 Softmax 回归:深度学习基础模型解析 - 实践

线性回归与 Softmax 回归:深度学习基础模型解析 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mon…...

浏览器下载,一定要开启这个隐藏功能!

大家好,我是 Immerse,一名独立开发者、内容创作者。关注公众号:沉浸式趣谈,获取最新文章(更多内容只在公众号更新) 个人网站:https://yaolifeng.com 也同步更新。 转载请在文章开头注明出处和版权信息。我会在这里分享关于编程、独立开发、AI干货、开源、个人思考等内容…...

开源项目进度管理系统 PJMan:让技术项目进度可视化、数据化的利器

在软件项目管理过程中,进度不透明、任务卡点难定位、人员效率难量化是许多技术团队面临的痛点。今天为大家介绍一款开源项目进度管理系统 ——PJMan,其「项目概览」页面通过分层可视化与数据驱动的设计,将项目的 “全局趋势、任务细节、人员效率” 全方位呈现,为技术团队提…...

【光照】[漫反射]UnityURP兰伯特能量守恒吗?

【从UnityURP开始探索游戏渲染】专栏-直达兰伯特漫反射的能量守恒性 ‌能量守恒基本原理‌ 在物理正确的渲染中,能量守恒要求:表面反射的光能总量 ≤ 入射光能 漫反射+高光反射 ≤ 1.0 没有能量凭空产生或消失‌经典兰伯特模型的能量守恒问题‌ 传统兰伯特漫反射公式: $漫反…...

Microsoft AI Genius 限时挑战赛:实战开启,等你应战!

通过 Microsoft AI Genius 系列 2.0 的实战专题课程,相信各位开发者对智能 GitHub Copilot 副驾驶 Agent Mode、Azure AI Foundry Agent Service(国际版)及 Copilot Studio 的理解与掌握达到了新高度。现在,是时候将所学理论转化为实际行动,投身真实场景检验成果了。 ↓↓…...

DevSecOps革命:测试工具如何重塑企业数字化转型的质量防线

DevSecOps革命:测试工具如何重塑企业数字化转型的质量防线 在数字化转型浪潮席卷全球的当下,软件质量保障体系正经历着前所未有的范式转变。DevSecOps作为这场变革的核心方法论,正在重新定义测试工具在企业技术栈中的战略地位。从单纯的"质量守门员"到贯穿全生命周…...

3.sysaux tablesace 清理

select min(snap_id),max(snap_id) from dba_hist_snapshot; 查完后,记录min和max的值 select dbid from v$database; 18701与18953分别为min与max的snap_id的值,387090299为dbid的值,将这些值代入下面的语句执行 begin dbms_workload_repository.drop_snapshot_range( low_…...

2.LOCK session

select * from v$session_blockers; 或者 select * from gv$session_blockers; (在rac情况下) 通过 select count(1) from v$locked_object; 可以查出内容 首先询问客户能否提供lock table的session sid和serial#,如果客户只能提供session sid,则 可以使用: select sid,ser…...

2025 ~ 2026 游击 - gfoi

2025/09/19 试了试 CSP-S 的历年题目,2019 年有 84.5 分。...

【初赛】第二类斯特林数意义 - Slayer

第二类斯特林数(斯特林子集数) \(\begin{Bmatrix}n\\ k\end{Bmatrix}\),也可记做 \(S(n,k)\),表示将 \(n\) 个两两不同的元素,划分为 \(k\) 个互不区分的非空子集的方案数。 通项公式 \(\begin{Bmatrix}n\\m\end{Bmatrix}=\sum\limits_{i=0}^m\dfrac{(-1)^{m-i}i^n}{i!(m-…...

在AI技术快速实现功能的时代,挖掘新需求成为核心竞争力——某知名Android面试题库需求洞察

该篇文章无摘要a.内容描述 该项目是一个专注于Android开发领域的技术面试题库,核心功能定位为提供全面的Android面试问题与答案集合,帮助开发者准备技术面试。关键应用场景包括Android开发者求职准备、技术知识查漏补缺、面试官题库参考等。项目内容覆盖了Android开发的各个方…...

php本地搭建知识库实现rag遇到的一些问题解决方式

1、向量化的问题,中文的话,使用尽量使用国内的嵌入模型,国外的虽然支持中文,但是还是比不上国内专门针对中文的优化 本地使用ollama 搭建的话 ,我使用的是 quentinz/bge-large-zh-v1.5:latest2、不规则的pdf文件,无法使用pdf插件读取内容问题,我是php 使用 smalot/pdf…...

docker操作包括使用docker制作为接口

Docker 化 Flask OCR 应用指南 1. 创建必要的文件 在你的 Flask 应用项目根目录下,你需要创建以下文件: 1.1 Dockerfile 这是一个文本文件,包含了构建 Docker 镜像所需的所有指令1 # 使用官方 Python 3.10 (Python 3.13)精简版作为基础镜像,减小镜像体积2 FROM python:3.…...

BuildingSystemPlugin使用指南

使用自定义碰撞 1.启用Use Custom Overlay:2.修改Overlapping Box的BoxExtent来设置大小(不能设置Scale来设置大小):...

openEuler 24.03 (LTS-SP2)安装mysql5.7.42

环境:OS:openEuler 24.03 (LTS-SP2)(安装时候没有图形界面的选择项可选)mysql:5.7.42 glib.2.17 操作系统下载https://www.openeuler.org/en/download/#openEuler%2024.03%20LTS%20SP2 查看系统glibc版本[root@localhost soft]# ldd --versionldd (GNU libc) 2.38Copyright (C)…...

Trae AI IDE与Gitee MCP深度整合:开启智能协作开发新时代

Trae AI IDE与Gitee MCP深度整合:开启智能协作开发新时代 在AI技术快速渗透软件开发领域的当下,字节跳动推出的Trae AI IDE凭借其创新的智能编码能力,正在重塑开发者的工作流程。这款国产AI编程工具通过深度整合Gitee MCP(Multi-agent Collaboration Platform)服务,为开发…...

LangChain 入门:从 0 到 1 搞懂 LLM 应用开发框架​

LangChain 入门:从 0 到 1 搞懂 LLM 应用开发框架​如果你常逛技术社区,大概率听过 “大语言模型(LLM)能做很多事”—— 写文案、答问题、编代码,但真要把它放进实际业务里,比如给公司做个智能客服、给团队搭个文档问答工具,却总卡壳:要么模型记不住上下文,聊两句就 “…...

[JOI Open 2023] 古代机器 2 / Ancient Machine 2 题解

[JOI Open 2023] 古代机器 2 / Ancient Machine 2传送门:[JOI Open 2023] 古代机器 2 / Ancient Machine 2 完全不会做这种交互题。 形式化题意:交互库有一个 01 串 \(s\)(下标从 \(0\) 开始),你需要通过若干次询问求出 \(s\),每次询问,你可以构造一个大小为 \(m\) 的自…...