From f629ad7262ed926e0f36f5597a2eaf987c821934 Mon Sep 17 00:00:00 2001 From: LoongArum <1@jindongjie.cn> Date: Tue, 27 May 2025 10:43:57 +0800 Subject: [PATCH 1/7] Add cn trasnalte for new pages --- .../styling/container-queries.md | 160 ++++++++++++++++++ .../current/concepts/blend-modes.md | 142 ++++++++++++++++ .../current/concepts/image-interpolation.md | 121 +++++++++++++ .../current/deployment/native-aot.md | 156 +++++++++++++++++ .../current/tutorials/groupbox.md | 77 +++++++++ 5 files changed, 656 insertions(+) create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/basics/user-interface/styling/container-queries.md create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/concepts/blend-modes.md create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/concepts/image-interpolation.md create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/native-aot.md create mode 100644 i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorials/groupbox.md diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/basics/user-interface/styling/container-queries.md b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/basics/user-interface/styling/container-queries.md new file mode 100644 index 000000000..84d2c81a3 --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/basics/user-interface/styling/container-queries.md @@ -0,0 +1,160 @@ +--- +id: container-queries +title: 容器查询 +--- + +# 容器查询 + +容器查询允许根据作为容器的祖先元素的大小来激活控件的样式。 + +:::tip +Avalonia 的容器查询类似于 CSS 的容器查询,但功能更有限,以适应 Avalonia 支持的平台和外形样式。如果将 Toplevel 设置为容器,它们也可以像媒体查询一样工作。 +::: + +## 工作原理 + +容器查询依赖于将祖先控件设置成容器。容器大小的更改会根据查询激活样式。这些查询可以检查容器的宽度或高度,或两者兼而有之。任何控件都可以是容器,但设置为容器的控件不能受链接到它的容器查询所托管的样式的影响。当查询被激活时,查询中托管的所有样式也将根据其选择器被激活。 + +## 如何使用查询 + +### 声明容器查询 +容器查询可以在 XAML 中定义为控件 `Styles` 属性的直接子元素,如下所示: + +```xml + + + + + + +``` + +它们也可以是 `ControlTheme` 样式的一部分: + +```xml + + ... + + + + + ... + + + + + + + + + + +``` +`Name` 属性定义了它将附加到的容器的名称。这不是一个唯一的标识符,多个容器查询可以使用相同的名称。 +`Query` 定义了激活包含大小的规则。请参阅下面的[查询](#查询)。 + +这使得它们在针对不同屏幕尺寸的主题,或根据其父元素中可用空间而具有不同形式的主题中非常易于使用。这带来了一些限制。 +1. 容器查询不能托管在 `Style` 元素中。 + 以下是无效的。 +```xml + + + + + + +``` +2. 在查询中声明的样式不能影响容器或其祖先。这与能够影响其父控件的普通 `Styles` 不同。因为容器查询依赖于容器的实际大小,让容器受到其查询激活的样式的影响可能会导致循环行为,即容器的大小被两个或多个查询连续更新。 + +### 声明容器 +只有当作为 `ContainerQuery` 主机后代的控件被声明为容器时,容器查询才起作用。设置任何控件的 `Container.Name` 和 `Container.Sizing` 附加属性将声明该控件为容器,如下所示: + +```xml + +``` + +2. **图像展示**:对于需要高质量画面的图像展示: +```xml + + + + + + + +``` + +## 性能考量 + +出于性能原因,插值模式是按控件设置的。更高质量的插值需要更多的计算资源,因此请考虑以下准则: + +- 对以下情况使用 `HighQuality`: + - 重要的 UI 元素,如徽标 + - 质量至关重要的缩小图像 + - 照片画廊或以图像为中心的界面 + +- 对以下情况使用默认的 `LowQuality`: + - 背景图像 + - 质量不太关键的装饰元素 + - 对性能敏感的应用程序 + +## 创建全局设置 + +虽然 Avalonia 没有提供内置的方法来设置全局插值模式,但您可以创建自定义附加属性或行为来在整个应用程序中管理此设置。以下是一个示例方法: + +```csharp +public static class GlobalImageOptions +{ + public static readonly AttachedProperty InterpolationModeProperty = + AvaloniaProperty.RegisterAttached( + "InterpolationMode", + typeof(GlobalImageOptions), + defaultValue: BitmapInterpolationMode.HighQuality); + + public static void SetInterpolationMode(Image image, BitmapInterpolationMode value) + { + image.SetValue(RenderOptions.BitmapInterpolationModeProperty, value); + } +} +``` + +然后在您的 XAML 中: + +```xml + +``` + +## 获得最佳效果的技巧 + +1. **素材准备**: + - 提供适合其预期显示尺寸的适当分辨率的图像 + - 考虑为重要素材包含多种分辨率 + - 尽可能使用矢量格式 (SVG) 以获得与分辨率无关的图形 + +2. **布局注意事项**: + - 注意原始图像尺寸与显示尺寸的关系 + - 使用适当的容器和布局面板来管理图像缩放 + - 考虑将 `UniformToFill` 或 `Uniform` 拉伸模式与高质量插值结合使用 + +3. **测试**: + - 在不同屏幕密度上测试图像渲染 + - 验证在许多图像上使用高质量插值时的性能影响 + - 检查不同插值设置下的内存使用情况 diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/native-aot.md b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/native-aot.md new file mode 100644 index 000000000..aad53c3ef --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/deployment/native-aot.md @@ -0,0 +1,156 @@ +--- +id: native-aot +title: Native AOT 部署 +--- + +Native AOT (Ahead-of-Time) 编译允许您将 Avalonia 应用程序发布为具有本机性能特征的自包含可执行文件。本指南涵盖了 Avalonia 特定的注意事项和 Native AOT 部署的设置。 + +## Avalonia 应用程序的优势 + +Native AOT 编译为 Avalonia 应用程序提供了几个特别相关的优势: + +- 更快的应用程序启动时间,尤其有利于桌面应用程序 +- 减少资源受限环境的内存占用 +- 自包含部署,无需安装 .NET 运行时 +- 通过减少攻击面(无 JIT 编译)提高安全性 +- 与裁剪结合使用时,分发包更小 + +## 为 Avalonia 设置 Native AOT + +### 1. 项目配置 + +将以下内容添加到您的 csproj 文件中: + +```xml + + true + + false + link + +``` + +### 2. 裁剪配置 + +Native AOT 需要裁剪。添加这些特定于 Avalonia 的裁剪设置: + +```xml + + + + + +``` + +## Avalonia 特定注意事项 + +### XAML 加载 +使用 Native AOT 时,XAML 会在构建时编译到应用程序中。请确保您: +- 在 XAML 文件中使用 `x:CompileBindings="True"` +- 避免在运行时动态加载 XAML +- 尽可能使用静态资源引用而不是动态资源 + +### 资产和资源 +- 将所有资产捆绑为嵌入式资源 +- 对您的资产使用 `AvaloniaResource` 构建操作 +- 避免从外部源动态加载资产 + +### ViewModel 和依赖注入 +- 在启动时注册您的 ViewModel +- 使用编译时 DI 配置 +- 避免基于反射的服务定位 + +## 发布 Avalonia Native AOT 应用程序 + +### Windows +```bash +dotnet publish -r win-x64 -c Release +``` + +### Linux +```bash +dotnet publish -r linux-x64 -c Release +``` + +### macOS +基于 Intel 的 macOS +```bash +dotnet publish -r osx-x64 -c Release +``` +基于 Apple 芯片的 macOS +```bash +dotnet publish -r osx-arm64 -c Release +``` + +:::tip +然后,您可以使用 Apple 的 [lipo 工具](https://developer.apple.com/documentation/apple-silicon/building-a-universal-macos-binary) 来合并 Intel 和 Apple Silicon 的二进制文件,从而使您能够发布通用二进制文件。 +::: + +## 故障排除常见问题 + +### 1. 缺少 XAML 控件 +如果运行时缺少控件: +```xml + + + + +``` + +### 2. 反射相关错误 +对于使用反射的 ViewModel 或服务: +```xml + + + +``` + +创建一个 `TrimmerRoots.xml`: +```xml + + + + + +``` + +## 已知限制 + +将 Native AOT 与 Avalonia 一起使用时,请注意以下限制: +- 动态控件创建必须在裁剪器设置中配置 +- 某些第三方 Avalonia 控件可能与 AOT 不兼容 +- 特定于平台的功能需要显式配置 +- 设计时工具中的实时预览可能受限 + +## 平台支持 + +| 平台 | 状态 | +|----------|--------| +| Windows x64 | ✅ 支持 | +| Windows Arm64 | ✅ 支持 | +| Linux x64 | ✅ 支持 | | +| Linux Arm64 | ✅ 支持 | +| macOS x64 | ✅ 支持 | | +| macOS Arm64 | ✅ 支持 | +| 浏览器 | ❌ 不支持 | + +## 最佳实践 + +1. **应用程序结构** + - 始终如一地使用 MVVM 模式 + - 最大限度地减少反射的使用 + - 优先选择编译时配置 + +2. **资源管理** + - 尽可能使用静态资源 + - 捆绑所有必需的资产 + - 在 IDisposable 中实现正确的清理 + +3. **性能优化** + - 启用绑定编译 + - 使用已编译的绑定 + - 为大型集合实现适当的虚拟化 + +## 额外资源 + +- [使用 Native AOT 的 Avalonia 示例应用程序](https://github.com/AvaloniaUI/Avalonia.Samples) \ No newline at end of file diff --git a/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorials/groupbox.md b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorials/groupbox.md new file mode 100644 index 000000000..ef5c93bed --- /dev/null +++ b/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorials/groupbox.md @@ -0,0 +1,77 @@ +--- +id: groupbox +title: 使用 HeaderedContentControl 创建 GroupBox +sidebar_label: 创建 GroupBox +--- + +import groupboxscreenshot from '/img/tutorials/groupbox/groupbox.png'; + + +虽然 Avalonia 没有内置的 `GroupBox` 控件,但您可以使用带有自定义样式的 `HeaderedContentControl` 来实现相同的功能和外观。`HeaderedContentControl` 提供了一个标题区域和内容区域,非常适合用于对相关的界面元素进行分组。 + + + +## 实现 +将以下样式添加到您的应用程序资源(通常在 App.axaml 中)或需要 `GroupBox` 功能的特定 `Window` 或 `UserControl` 中: + +```xml title='XAML' + +``` + +样式设置好后,您就可以在 XAML 中使用 `HeaderedContentControl` 了: + +```xml title='XAML' + + + +