🦄 Beautiful AntdUI

This commit is contained in:
Tom
2025-08-29 19:23:51 +08:00
parent 75410ac625
commit 56c6ab7b8a
36 changed files with 769 additions and 434 deletions

93
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,93 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We pledge to make our community welcoming, safe, and equitable for all.
We are committed to fostering an environment that respects and promotes the dignity, rights, and contributions of all individuals, regardless of characteristics including race, ethnicity, caste, color, age, physical characteristics, neurodiversity, disability, sex or gender, gender identity or expression, sexual orientation, language, philosophy or religion, national or social origin, socio-economic position, level of education, or other status. The same privileges of participation are extended to everyone who participates in good faith and in accordance with this Covenant.
## Encouraged Behaviors
While acknowledging differences in social norms, we all strive to meet our community's expectations for positive behavior. We also understand that our words and actions may be interpreted differently than we intend based on culture, background, or native language.
With these considerations in mind, we agree to behave mindfully toward each other and act in ways that center our shared values, including:
1. Respecting the **purpose of our community**, our activities, and our ways of gathering.
2. Engaging **kindly and honestly** with others.
3. Respecting **different viewpoints** and experiences.
4. **Taking responsibility** for our actions and contributions.
5. Gracefully giving and accepting **constructive feedback**.
6. Committing to **repairing harm** when it occurs.
7. Behaving in other ways that promote and sustain the **well-being of our community**.
## Restricted Behaviors
We agree to restrict the following behaviors in our community. Instances, threats, and promotion of these behaviors are violations of this Code of Conduct.
1. **Harassment.** Violating explicitly expressed boundaries or engaging in unnecessary personal attention after any clear request to stop.
2. **Character attacks.** Making insulting, demeaning, or pejorative comments directed at a community member or group of people.
3. **Stereotyping or discrimination.** Characterizing anyones personality or behavior on the basis of immutable identities or traits.
4. **Sexualization.** Behaving in a way that would generally be considered inappropriately intimate in the context or purpose of the community.
5. **Violating confidentiality**. Sharing or acting on someone's personal or private information without their permission.
6. **Endangerment.** Causing, encouraging, or threatening violence or other harm toward any person or group.
7. Behaving in other ways that **threaten the well-being** of our community.
### Other Restrictions
1. **Misleading identity.** Impersonating someone else for any reason, or pretending to be someone else to evade enforcement actions.
2. **Failing to credit sources.** Not properly crediting the sources of content you contribute.
3. **Promotional materials**. Sharing marketing or other commercial content in a way that is outside the norms of the community.
4. **Irresponsible communication.** Failing to responsibly present content which includes, links or describes any other restricted behaviors.
## Reporting an Issue
Tensions can occur between community members even when they are trying their best to collaborate. Not every conflict represents a code of conduct violation, and this Code of Conduct reinforces encouraged behaviors and norms that can help avoid conflicts and minimize harm.
When an incident does occur, it is important to report it promptly. To report a possible violation, **[NOTE: describe your means of reporting here.]**
Community Moderators take reports of violations seriously and will make every effort to respond in a timely manner. They will investigate all reports of code of conduct violations, reviewing messages, logs, and recordings, or interviewing witnesses and other participants. Community Moderators will keep investigation and enforcement actions as transparent as possible while prioritizing safety and confidentiality. In order to honor these values, enforcement actions are carried out in private with the involved parties, but communicating to the whole community may be part of a mutually agreed upon resolution.
## Addressing and Repairing Harm
**[NOTE: The remedies and repairs outlined below are suggestions based on best practices in code of conduct enforcement. If your community has its own established enforcement process, be sure to edit this section to describe your own policies.]**
If an investigation by the Community Moderators finds that this Code of Conduct has been violated, the following enforcement ladder may be used to determine how best to repair harm, based on the incident's impact on the individuals involved and the community as a whole. Depending on the severity of a violation, lower rungs on the ladder may be skipped.
1) Warning
1) Event: A violation involving a single incident or series of incidents.
2) Consequence: A private, written warning from the Community Moderators.
3) Repair: Examples of repair include a private written apology, acknowledgement of responsibility, and seeking clarification on expectations.
2) Temporarily Limited Activities
1) Event: A repeated incidence of a violation that previously resulted in a warning, or the first incidence of a more serious violation.
2) Consequence: A private, written warning with a time-limited cooldown period designed to underscore the seriousness of the situation and give the community members involved time to process the incident. The cooldown period may be limited to particular communication channels or interactions with particular community members.
3) Repair: Examples of repair may include making an apology, using the cooldown period to reflect on actions and impact, and being thoughtful about re-entering community spaces after the period is over.
3) Temporary Suspension
1) Event: A pattern of repeated violation which the Community Moderators have tried to address with warnings, or a single serious violation.
2) Consequence: A private written warning with conditions for return from suspension. In general, temporary suspensions give the person being suspended time to reflect upon their behavior and possible corrective actions.
3) Repair: Examples of repair include respecting the spirit of the suspension, meeting the specified conditions for return, and being thoughtful about how to reintegrate with the community when the suspension is lifted.
4) Permanent Ban
1) Event: A pattern of repeated code of conduct violations that other steps on the ladder have failed to resolve, or a violation so serious that the Community Moderators determine there is no way to keep the community safe with this person as a member.
2) Consequence: Access to all community spaces, tools, and communication channels is removed. In general, permanent bans should be rarely used, should have strong reasoning behind them, and should only be resorted to if working through other remedies has failed to change the behavior.
3) Repair: There is no possible repair in cases of this severity.
This enforcement ladder is intended as a guideline. It does not limit the ability of Community Managers to use their discretion and judgment, in keeping with the best interests of our community.
## Scope
This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public or other spaces. Examples of representing our community include using an official email address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
## Attribution
This Code of Conduct is adapted from the Contributor Covenant, version 3.0, permanently available at [https://www.contributor-covenant.org/version/3/0/](https://www.contributor-covenant.org/version/3/0/).
Contributor Covenant is stewarded by the Organization for Ethical Source and licensed under CC BY-SA 4.0. To view a copy of this license, visit [https://creativecommons.org/licenses/by-sa/4.0/](https://creativecommons.org/licenses/by-sa/4.0/)
For answers to common questions about Contributor Covenant, see the FAQ at [https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq). Translations are provided at [https://www.contributor-covenant.org/translations](https://www.contributor-covenant.org/translations). Additional enforcement and community guideline resources can be found at [https://www.contributor-covenant.org/resources](https://www.contributor-covenant.org/resources). The enforcement ladder was inspired by the work of [Mozillas code of conduct team](https://github.com/mozilla/inclusion).

157
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,157 @@
# 🦄 Contributing to AntdUI
This guide explains the standards and workflows to help you collaborate smoothly, maintain code consistency, and navigate the project effectively.
## 1. Directory Structure
Familiarize yourself with the directory layout to ensure your contributions are placed in the correct location:
```
AntdUI/
├─ src/ # Core source code for all libraries
│ └─ AntdUI/ # Main UI library code
│ ├─ Controls/ # Custom UI controls
│ │ ├─ Core/ # Abstract drawing classes and implementation classes (base for all controls)
│ │ └─ Chat/ # Chat-related controls (separated due to independent logic or large code volume)
│ ├─ Design/ # Designer support (e.g., Visual Studio designer integration)
│ ├─ Enum/ # Enumerations used across the library (e.g., theme types, control states)
│ ├─ Forms/ # Custom windows/forms (e.g., main application windows)
│ ├─ LayeredWindow/ # Popup/layered windows (e.g., dropdowns, date pickers, Modals, drawers)
│ ├─ Lib/ # Utility files (Win32 API wrappers, SVG handlers, helper classes)
│ ├─ Localization/ # Multi-language support (resource files for different locales)
│ └─ Style/ # Theme definitions (e.g., light/dark themes, color palettes)
├─ samples/ # Demo projects to showcase control usage
│ └─ Demo/ # Main demo project (includes test forms for all controls)
└─ doc/ # Documentation (contribution guides, API references, etc.)
```
- **New Controls**: Add custom controls to `src/AntdUI/Controls/` (use subfolders like `Chat/` for independent/large controls).
- **Utility Code**: Place helper functions, Win32 wrappers, or SVG tools in `src/AntdUI/Lib/`.
- **Demo Code**: Update `samples/Demo/` to include test cases for new features (helps verify functionality and assist other contributors).
## 2. Code Standards
To maintain consistency and avoid common issues (e.g., memory leaks, UI glitches), follow these core rules:
### 2.1 Drawing Logic Requirements
AntdUI relies on a custom drawing system for high-quality UI rendering. Adhere to these rules for all visual controls:
- **Must Implement `AntdUI.IControl`**:
All drawable controls **must inherit from `AntdUI.IControl`** (the base interface for custom rendering). Override the `OnDraw` method to implement control-specific drawing:
```csharp
public class MyCustomControl : IControl
{
// Override OnDraw to handle rendering
protected override void OnDraw(DrawEventArgs e)
{
base.OnDraw(e);
// Use e.Canvas for drawing (see note below)
e.Canvas.DrawText("Hello AntdUI", _textFont, _textColor, ClientRectangle);
}
}
```
- **Use `Canvas` for Rendering**:
The `Canvas` class (accessed via `Graphics.High()` if `IControl` is not inherited) provides built-in support for **high-quality text** (e.g., anti-aliasing) and **Emoji rendering**—features not natively supported by GDIs `Graphics` class.
- If you cannot inherit `IControl` (e.g., for system control wrappers), use `Canvas` like this:
```csharp
var canvas = e.Graphics.High(); // Get Canvas instance
string emoji = "👍";
Size size = canvas.MeasureText(emoji, Font);
canvas.DrawText(emoji, Font, Style.Db.Text, new Rectangle(0, 0, size.Width, size.Height));
```
- **Resource Disposal**:
Always release GDI resources (e.g., `Bitmap`, `Brush`, `Pen`) immediately after use to avoid memory leaks. Use `using` statements for automatic disposal:
```csharp
// Recommended: Auto-dispose Brush with 'using'
using (var fillBrush = new SolidBrush(_backgroundColor))
{
e.Canvas.Fill(fillBrush, ClientRectangle);
}
// Avoid: Unmanaged resource leaks (no Dispose)
var badBrush = new SolidBrush(_backgroundColor);
e.Canvas.Fill(badBrush, ClientRectangle); // ❌ Leaks memory
```
### 2.2 List Control Standards
For controls with scrollable content (e.g., list boxes, data grids), follow these rules to ensure consistency:
- **Use `AntdUI.ScrollBar`**:
Do not use system scrollbars—always integrate `AntdUI.ScrollBar` (the librarys custom scrollbar component) for uniform styling and behavior.
- **Expose Public Properties**:
Make scrollbar-related properties accessible to external code (e.g., for customization by end-users).
### 2.3 `IControl.RenderRegion` Usage
The `GraphicsPath RenderRegion` property in `AntdUI.IControl` is critical for **correct mask rendering** (e.g., for Spin controls on rounded-corner components).
- **Set `RenderRegion` for Rounded Controls**:
If your control has rounded corners (or non-rectangular shapes), define `RenderRegion` to ensure Spin controls (or other overlay elements) respect the controls shape:
```csharp
protected override GraphicsPath RenderRegion
{
get
{
return ClientRectangle.RoundPath(8 * Config.Dpi);
}
}
```
- Without `RenderRegion`, overlays like Spin may display as rectangular (breaking the UIs visual consistency).
## 3. Contribution Workflow
> To demonstrate how to contribute code using [**Pull Request**](https://github.com/AntdUI/AntdUI/compare/main...main) (referred to as "PR" below)
### 3.1 First, Fork the official [AntdUI](https://github.com/AntdUI/AntdUI) repository to your own account
> Click the **Fork** button in the upper right corner
![1](doc/wiki/en/Img/PR_1.png)
### 3.2 Confirm the fork target
> By default, it will fork to your personal account. Click **Create fork** to continue
![2](doc/wiki/en/Img/PR_2.png)
> Wait for the forking process to complete. The page will refresh automatically once finished.
> ![3](doc/wiki/en/Img/PR_3.png)
### 3.3 Clone the repository from your personal account
> Click **Code**, then copy the `.git` URL from the pop-up window. ⚠ Note: Ensure it's the URL from your **own repository**
![5](doc/wiki/en/Img/PR_5.png)
Open [Visual Studio](https://visualstudio.microsoft.com), clone the URL you just copied, and after successful cloning, **commit the code you want to contribute**.
### 3.4 Initiate [PR](https://github.com/AntdUI/AntdUI/compare/main...main)
> Click the **Pull requests** tab, or [click **Pull Request** to jump to the PR submission page](https://github.com/AntdUI/AntdUI/compare/main...main), then click **New pull request** to start the PR
![6](doc/wiki/en/Img/PR_6.png)
### 3.5 Final step
> After verifying and adjusting your submission, click **Create pull request**
![7](doc/wiki/en/Img/PR_7.png)
> Fill in the PR title and description. Clearly state what changes you made and why you made them. Click **Create pull request** again to confirm submission
![8](doc/wiki/en/Img/PR_8.png)
> I will review your PR as soon as I receive it. 🧙 Have a nice day!
### Note: Remember to sync with the official repository before your next contribution
![4](doc/wiki/en/Img/PR_4.png)
---
Thank you for helping improve AntdUI—your contributions make this project better for everyone! 🚀

165
CONTRIBUTING.zh.md Normal file
View File

@@ -0,0 +1,165 @@
# 🦄 参与 AntdUI 贡献
本文档将介绍参与 AntdUI 贡献的标准和工作流程,帮助你顺利协作、保持代码一致性,并高效熟悉项目。
## 1. 目录结构
请先了解项目的目录布局,确保你的贡献内容放在正确位置:
```
AntdUI/
├─ src/ # 所有核心库源代码
│ └─ AntdUI/ # 主UI库代码
│ ├─ Controls/ # 自定义UI控件
│ │ ├─ Core/ # 抽象绘制类和实现类(所有控件的基础)
│ │ └─ Chat/ # 聊天相关控件(因逻辑独立或代码量较大而单独存放)
│ ├─ Design/ # 设计器支持如Visual Studio设计器集成
│ ├─ Enum/ # 库中通用的枚举(如主题类型、控件状态)
│ ├─ Forms/ # 自定义窗口/表单(如主应用窗口)
│ ├─ LayeredWindow/ # 弹窗/分层窗口(如下拉框、日期选择器、模态框、抽屉等)
│ ├─ Lib/ # 工具文件Win32 API封装、SVG处理、辅助类
│ ├─ Localization/ # 多语言支持(不同地区的资源文件)
│ └─ Style/ # 主题定义(如明暗主题、调色板)
├─ samples/ # 用于展示控件用法的示例项目
│ └─ Demo/ # 主示例项目(包含所有控件的测试窗体)
└─ doc/ # 文档贡献指南、API参考等
```
- **新增控件**:请添加到 `src/AntdUI/Controls/`(独立或大型控件可像 `Chat/` 一样使用子文件夹)。
- **工具代码**辅助函数、Win32封装或SVG工具请放在 `src/AntdUI/Lib/`
- **示例代码**:请更新 `samples/Demo/` 以包含新功能的测试用例(有助于验证功能并帮助其他贡献者)。
## 2. 代码规范
为保持一致性并避免常见问题如内存泄漏、UI异常请遵循以下核心规则
### 2.1 绘制逻辑要求
AntdUI 依赖自定义绘制系统实现高质量UI渲染。所有可视化控件需遵循
- **必须实现 `AntdUI.IControl`**
所有可绘制控件**必须继承 `AntdUI.IControl`**(自定义渲染的基础接口)。通过重写 `OnDraw` 方法实现控件特定绘制:
```csharp
public class MyCustomControl : IControl
{
// 重写OnDraw处理渲染逻辑
protected override void OnDraw(DrawEventArgs e)
{
base.OnDraw(e);
// 使用e.Canvas进行绘制见下方说明
e.Canvas.DrawText("Hello AntdUI", _textFont, _textColor, ClientRectangle);
}
}
```
- **使用 `Canvas` 进行渲染**
`Canvas` 类(若无法继承 `IControl`,可通过 `Graphics.High()` 获取)提供**高质量文本**(如抗锯齿)和**Emoji渲染**支持——这些是GDI原生 `Graphics` 类不具备的特性。
- 若无法继承 `IControl`(如系统控件封装),可这样使用 `Canvas`
```csharp
var canvas = e.Graphics.High(); // 获取Canvas实例
string emoji = "👍";
Size size = canvas.MeasureText(emoji, Font);
canvas.DrawText(emoji, Font, Style.Db.Text, new Rectangle(0, 0, size.Width, size.Height));
```
- **资源释放**
GDI资源如 `Bitmap`、`Brush`、`Pen`)使用后必须立即释放,避免内存泄漏。推荐使用 `using` 语句自动释放:
```csharp
// 推荐使用using自动释放Brush
using (var fillBrush = new SolidBrush(_backgroundColor))
{
e.Canvas.Fill(fillBrush, ClientRectangle);
}
// 避免:未释放非托管资源
var badBrush = new SolidBrush(_backgroundColor);
e.Canvas.Fill(badBrush, ClientRectangle); // ❌ 导致内存泄漏
```
### 2.2 列表类控件规范
对于带滚动内容的控件(如列表框、数据网格),请遵循:
- **使用 `AntdUI.ScrollBar`**
禁止使用系统滚动条,必须集成库内置的 `AntdUI.ScrollBar` 组件,以保证样式和行为统一。
- **公共属性**
需将滚动条相关属性开放给外部代码(方便用户自定义)。
### 2.3 `IControl.RenderRegion` 用法
`AntdUI.IControl` 中的 `GraphicsPath RenderRegion` 属性对**遮罩正确渲染**至关重要如圆角控件上的Spin控件
- **圆角控件需设置 `RenderRegion`**
若控件为圆角(或非矩形),需定义 `RenderRegion` 以确保Spin控件或其他覆盖元素适配控件形状
```csharp
protected override GraphicsPath RenderRegion
{
get
{
return ClientRectangle.RoundPath(8 * Config.Dpi);
}
}
```
- 若不设置 `RenderRegion`Spin等覆盖元素可能显示为矩形破坏UI一致性。
## 3. 贡献流程
> 以下演示如何通过 [**合并请求Pull Request简称PR**](https://gitee.com/AntdUI/AntdUI/compare/main...main) 贡献代码
### 3.1 首先在 [AntdUI](https://gitee.com/AntdUI/AntdUI) 官方仓库Fork 到自己账号
> 点击右上角 **Fork** 按钮
![1](doc/wiki/zh/Img/PR_1.png)
### 3.2 选择 Fork 目标空间
> 默认个人,也就是自己,点击 **确认** 继续
![2](doc/wiki/zh/Img/PR_2.png)
> 等待 Fork 完成,完成后会自动跳转
> ![3](doc/wiki/zh/Img/PR_3.png)
### 3.3 在自己空间地址克隆项目
> 点击 **克隆/下载**,⚠ 注意是自己的**空间地址**
![4](doc/wiki/zh/Img/PR_4.png)
点击第一个 `.git` 地址复制
![5](doc/wiki/zh/Img/PR_5.png)
### 3.4 提交贡献代码到自己仓库
> 打开 [Visual Studio](https://visualstudio.microsoft.com) 克隆刚刚复制的地址,选择目录,点击 **克隆** 继续
![6](doc/wiki/zh/Img/PR_6.png)
克隆成功后,提交需要贡献的代码
### 3.5 发起 [PR](https://gitee.com/AntdUI/AntdUI/compare/main...main)
> 点击 **Pull requests** 选项卡,或者[点击**Pull Request**跳转提交PR页面](https://gitee.com/AntdUI/AntdUI/compare/main...main)
![7](doc/wiki/zh/Img/PR_7.png)
点击 **新建 Pull Request**
![8](doc/wiki/zh/Img/PR_8.png)
### 大功告成
提交内容调整核实后,点击 **创建 Pull Request**
![9](doc/wiki/zh/Img/PR_9.png)
> 收到后,我会尽快审核,🧙 生活愉快
---
感谢您为AntdUI的改进提供帮助——您的贡献让这个项目变得更好🚀

View File

@@ -1,130 +0,0 @@
<div align="center">
<img height="100" src="src/logo.png">
<h1>AntdUI</h1>
[![NuGet](https://img.shields.io/nuget/v/AntdUI.svg?style=flat-square&label=AntdUI&logo=nuget)](https://www.nuget.org/packages/AntdUI)
[![AntDesign](https://img.shields.io/badge/AntDesign%20-5.0-1677ff?style=flat-square&logo=antdesign)](https://ant-design.antgroup.com/components/overview-cn)
[![Download](https://img.shields.io/nuget/dt/antdui?style=flat-square)](https://www.nuget.org/packages/AntdUI)
[![License](https://img.shields.io/badge/license-Apache%202.0-4EB1BA.svg?style=flat-square)](http://www.apache.org/licenses/LICENSE-2.0)
[中文](README.md)・English・[Document](doc/wiki/en/Home.md)・[UpdateLog](doc/wiki/en/UpdateLog.md)・[Demo](https://gitee.com/mubaiyanghua/antdui-demo)
</div>
![banner](doc/pre/banner-en.png)
### 🦄 Introduce
Ant Design for WinForms, reimagines desktop app aesthetics with modern frontend design elements. Using pure GDI graphics, no image resources required, fully supports AOT.
### ✨ Features
- 🌈 High quality anti aliasing text rendering
- 🎨 Pure GDI vector graphics, comfortable dynamic effects that can be interrupted
- 😍 Emoji breaks the black and white boundaries and adds fun
- 💎 Superior shadow effects on Winforms
- 📦 Borderless window with native window features
- 👚 Theme configuration, black and white mode
- 🌍 Internationale
- 🦜 SVG vector graphics
- 👓 DPI adaptation
- 🦺 AOT Release
### 🖥 Requirements
- .NET 9.0
- .NET 6.0
- .NET Framework4.8
- .NET Framework4.0 and above
### 🌴 Control
⬇️| General `2` | Animation | Disable |
:---:|:--|:--:|:--:|
➡️| [**Button**](doc/wiki/en/Control/Button.md) | ✅ | ✅ |
➡️| [**FloatButton**](doc/wiki/en/Control/FloatButton.md) | ✅ | ❎ |
||||
⬇️| Layout `5` | Animation | Disable |
➡️| [**Divider**](doc/wiki/en/Control/Divider.md) | ❎ | ❎ |
➡️| [**StackPanel**](doc/wiki/en/Control/StackPanel.md) | ❎ | ❎ |
➡️| [**FlowPanel**](doc/wiki/en/Control/FlowPanel.md) | ❎ | ❎ |
➡️| [**GridPanel**](doc/wiki/en/Control/GridPanel.md) | ❎ | ❎ |
➡️| [**Splitter**](doc/wiki/zh/Control/Splitter.md) | ❎ | ❎ |
||||
⬇️| Navigation `7` | Animation | Disable |
➡️| [**Breadcrumb**](doc/wiki/en/Control/Breadcrumb.md) | ✅ | ❎ |
➡️| [**Dropdown**](doc/wiki/en/Control/Dropdown.md) | ✅ | ✅ |
➡️| [**Menu**](doc/wiki/en/Control/Menu.md) | ✅ | ❎ |
➡️| [**PageHeader**](doc/wiki/en/Control/PageHeader.md) | ✅ | ❎ |
➡️| [**TabHeader**](doc/wiki/en/Control/TabHeader.md) | ✅ | ❎ |
➡️| [**Pagination**](doc/wiki/en/Control/Pagination.md) | ✅ | ✅ |
➡️| [**Steps**](doc/wiki/en/Control/Steps.md) | ❎ | ❎ |
||||
⬇️| Data Entry `13` | Animation | Disable |
➡️| [**Checkbox**](doc/wiki/en/Control/Checkbox.md) | ✅ | ✅ |
➡️| [**ColorPicker**](doc/wiki/en/Control/ColorPicker.md) | ✅ | ✅ |
➡️| [**DatePicker**](doc/wiki/en/Control/DatePicker.md) | ✅ | ✅ |
➡️| [**DatePickerRange**](doc/wiki/en/Control/DatePicker.md#datepickerrange) | ✅ | ✅ |
➡️| [**Input**](doc/wiki/en/Control/Input.md) | ✅ | ✅ |
➡️| [**InputNumber**](doc/wiki/en/Control/Input.md#inputnumber) | ✅ | ✅ |
➡️| [**Radio**](doc/wiki/en/Control/Radio.md) | ✅ | ✅ |
➡️| [**Rate**](doc/wiki/en/Control/Rate.md) | ✅ | ❎ |
➡️| [**Select**](doc/wiki/en/Control/Select.md) | ✅ | ✅ |
➡️| [**Slider**](doc/wiki/en/Control/Slider.md) | ✅ | ❎ |
➡️| [**Switch**](doc/wiki/en/Control/Switch.md) | ✅ | ✅ |
➡️| [**TimePicker**](doc/wiki/en/Control/TimePicker.md) | ✅ | ✅ |
➡️| [**UploadDragger**](doc/wiki/en/Control/UploadDragger.md) | ✅ | ❎ |
||||
⬇️| Data Display `18` | Animation | Disable |
➡️| [**Avatar**](doc/wiki/en/Control/Avatar.md) | ❎ | ❎ |
➡️| [**Badge**](doc/wiki/en/Control/Badge.md) | ✅ | ❎ |
➡️| [**Calendar**](doc/wiki/en/Control/Calendar.md) | ✅ | ❎ |
➡️| [**Panel**](doc/wiki/en/Control/Panel.md) | ✅ | ❎ |
➡️| [**Carousel**](doc/wiki/en/Control/Carousel.md) | ✅ | ❎ |
➡️| [**Collapse**](doc/wiki/en/Control/Collapse.md) | ✅ | ❎ |
➡️| [**Preview**](doc/wiki/en/Control/Preview.md) | ✅ | ✅ |
➡️| [**Popover**](doc/wiki/en/Control/Popover.md) | ✅ | ❎ |
➡️| [**Segmented**](doc/wiki/en/Control/Segmented.md) | ✅ | ✅ |
➡️| [**Table**](doc/wiki/en/Control/Table.md) | ✅ | ❎ |
➡️| [**Tabs**](doc/wiki/en/Control/Tabs.md) | ✅ | ❎ |
➡️| [**Tag**](doc/wiki/en/Control/Tag.md) | ✅ | ❎ |
➡️| [**Timeline**](doc/wiki/en/Control/Timeline.md) | ❎ | ❎ |
➡️| [**Tooltip**](doc/wiki/en/Control/Tooltip.md) | ✅ | ❎ |
➡️| [**Tour**](doc/wiki/en/Control/Tour.md) | ✅ | ❎ |
➡️| [**Tree**](doc/wiki/en/Control/Tree.md) | ✅ | ✅ |
➡️| [**Label**](doc/wiki/en/Control/Label.md) | ✅ | ❎ |
➡️| [**LabelTime**](doc/wiki/zh/Control/LabelTime.md) | ✅ | ❎ |
||||
⬇️| Feedback `7` | Animation | Disable |
➡️| [**Alert**](doc/wiki/en/Control/Alert.md) | ✅ | ❎ |
➡️| [**Drawer**](doc/wiki/en/Control/Drawer.md) | ✅ | ❎ |
➡️| [**Message**](doc/wiki/en/Control/Message.md) | ✅ | ❎ |
➡️| [**Modal**](doc/wiki/en/Control/Modal.md) | ✅ | ❎ |
➡️| [**Notification**](doc/wiki/en/Control/Notification.md) | ✅ | ❎ |
➡️| [**Progress**](doc/wiki/en/Control/Progress.md) | ✅ | ❎ |
➡️| [**Spin**](doc/wiki/en/Control/Spin.md) | ✅ | ❎ |
⬇️| Chat `2` | Animation | Disable |
➡️| **MsgList** Friend message list | ✅ | ❎ |
➡️| **ChatList** Chat bubble list | ✅ | ❎ |
||||
⬇️| Other `5` | Animation | Disable |
➡️| [**Battery**](doc/wiki/en/Control/Battery.md) | ✅ | ❎ |
➡️| [**Signal**](doc/wiki/en/Control/Signal.md) | ✅ | ❎ |
➡️| [**Shield**](doc/wiki/en/Control/Shield.md) | ❎ | ❎ |
➡️| [**ContextMenuStrip**](doc/wiki/en/Control/ContextMenuStrip.md) | ✅ | ❎ |
➡️| **Image3D** | ✅ | ❎ |
### 🐿️ Donation
![Payment](doc/pre/Payment.png)
### 🎨 Screenshot
#### ChatUI
> Pure GDI drawing (without inheriting from `TextBox`)
![ChatUI](doc/screenshot/ChatUI.gif)
🦦

190
README.md
View File

@@ -5,136 +5,126 @@
<h1>AntdUI</h1>
[![NuGet](https://img.shields.io/nuget/v/AntdUI.svg?style=flat-square&label=AntdUI&logo=nuget)](https://www.nuget.org/packages/AntdUI)
[![QQGroup](https://img.shields.io/badge/QQ群-328884096-f74658?style=flat-square&logo=qq)](https://qm.qq.com/cgi-bin/qm/qr?k=ZfuHy4LqYC57DYTWAUWkQD9EjdVfvx3y&jump_from=webapi&authKey=4sAgZN0XlFHx+4MW9PdkiGgg435QfKcQdu5lKi1Fp4PP0O+DL6NaKAcV8ybCLM97)
[![Download](https://img.shields.io/nuget/dt/antdui?style=flat-square)](https://www.nuget.org/packages/AntdUI)
[![AntDesign](https://img.shields.io/badge/AntDesign%20-5.0-1677ff?style=flat-square&logo=antdesign)](https://ant-design.antgroup.com/components/overview-cn)
[![Download](https://img.shields.io/nuget/dt/antdui?style=flat-square)](https://www.nuget.org/packages/AntdUI)
[![License](https://img.shields.io/badge/license-Apache%202.0-4EB1BA.svg?style=flat-square)](http://www.apache.org/licenses/LICENSE-2.0)
中文・[English](README-en.md)・[文档](doc/wiki/zh/Home.md)・[更新日志](doc/wiki/zh/UpdateLog.md)・[演示](https://gitee.com/mubaiyanghua/antdui-demo)
[中文](README.zh.md)・English・[Document](doc/wiki/en/Home.md)・[UpdateLog](doc/wiki/en/UpdateLog.md)・[Demo](https://github.com/AntdUI/AntdUI-Demo)
</div>
![banner](doc/pre/banner.png)
![banner](doc/pre/banner-en.png)
### 🦄 介绍
### 🦄 Introduce
基于 Ant Design 设计语言的 WinForm UI 界面库致力于将现代美观的前端设计风格带入到桌面应用程序中。采用纯GDI绘图不需任何图片资源全面支持AOT最低兼容 `.NET Framework 4.0`
Ant Design for WinForms, reimagines desktop app aesthetics with modern frontend design elements. Using pure GDI graphics, no image resources required, fully supports AOT.
### ✨ 特性
### ✨ Features
- 🌈 高质量抗锯齿文字渲染
- 🎨 GDI 矢量绘图,能打断的舒适动效
- 😍 Emoji 打破黑白界限,增加趣味
- 💎 Winform 上最阴影的阴影效果
- 📦 无边框窗口,拥有原生窗口特性
- 👚 主题配置​,黑白模式
- 🌍 全球化支持
- 🦜 SVG 矢量图
- 👓 DPI 适配
- 🦺 AOT 发布
- 🌈 High quality anti aliasing text rendering
- 🎨 Pure GDI vector graphics, comfortable dynamic effects that can be interrupted
- 😍 Emoji breaks the black and white boundaries and adds fun
- 💎 Superior shadow effects on Winforms
- 📦 Borderless window with native window features
- 👚 Theme configuration, black and white mode
- 🌍 Internationale
- 🦜 SVG vector graphics
- 👓 DPI adaptation
- 🦺 AOT Release
### 🖥 环境
### 🖥 Requirements
- .NET 9.0
- .NET 6.0
- .NET Framework4.8
- .NET Framework4.0及以上
- .NET Framework4.0 and above
### 🌴 控件
### 🌴 Control
⬇️| 通用 `2` | 动画 | 禁用 |
⬇️| General `2` | Animation | Disable |
:---:|:--|:--:|:--:|
➡️| [**Button** 按钮](doc/wiki/zh/Control/Button.md) | ✅ | ✅ |
➡️| [**FloatButton** 悬浮按钮](doc/wiki/zh/Control/FloatButton.md) | ✅ | ❎ |
➡️| [**Button**](doc/wiki/en/Control/Button.md) | ✅ | ✅ |
➡️| [**FloatButton**](doc/wiki/en/Control/FloatButton.md) | ✅ | ❎ |
||||
⬇️| 布局 `5` | 动画 | 禁用 |
➡️| [**Divider** 分割线](doc/wiki/zh/Control/Divider.md) | ❎ | ❎ |
➡️| [**StackPanel** 堆栈布局](doc/wiki/zh/Control/StackPanel.md) | ❎ | ❎ |
➡️| [**FlowPanel** 流动布局](doc/wiki/zh/Control/FlowPanel.md) | ❎ | ❎ |
➡️| [**GridPanel** 格栅布局](doc/wiki/zh/Control/GridPanel.md) | ❎ | ❎ |
➡️| [**Splitter** 分隔面板](doc/wiki/zh/Control/Splitter.md) | ❎ | ❎ |
⬇️| Layout `5` | Animation | Disable |
➡️| [**Divider**](doc/wiki/en/Control/Divider.md) | ❎ | ❎ |
➡️| [**StackPanel**](doc/wiki/en/Control/StackPanel.md) | ❎ | ❎ |
➡️| [**FlowPanel**](doc/wiki/en/Control/FlowPanel.md) | ❎ | ❎ |
➡️| [**GridPanel**](doc/wiki/en/Control/GridPanel.md) | ❎ | ❎ |
➡️| [**Splitter**](doc/wiki/zh/Control/Splitter.md) | ❎ | ❎ |
||||
⬇️| 导航 `7` | 动画 | 禁用 |
➡️| [**Breadcrumb** 面包屑](doc/wiki/zh/Control/Breadcrumb.md) | ✅ | ❎ |
➡️| [**Dropdown** 下拉菜单](doc/wiki/zh/Control/Dropdown.md) | ✅ | ✅ |
➡️| [**Menu** 导航菜单](doc/wiki/zh/Control/Menu.md) | ✅ | ❎ |
➡️| [**PageHeader** 页头](doc/wiki/zh/Control/PageHeader.md) | ✅ | ❎ |
➡️| [**TabHeader** 多标签页头](doc/wiki/zh/Control/TabHeader.md) | ✅ | ❎ |
➡️| [**Pagination** 分页](doc/wiki/zh/Control/Pagination.md) | ✅ | ✅ |
➡️| [**Steps** 步骤条](doc/wiki/zh/Control/Steps.md) | ❎ | ❎ |
⬇️| Navigation `7` | Animation | Disable |
➡️| [**Breadcrumb**](doc/wiki/en/Control/Breadcrumb.md) | ✅ | ❎ |
➡️| [**Dropdown**](doc/wiki/en/Control/Dropdown.md) | ✅ | ✅ |
➡️| [**Menu**](doc/wiki/en/Control/Menu.md) | ✅ | ❎ |
➡️| [**PageHeader**](doc/wiki/en/Control/PageHeader.md) | ✅ | ❎ |
➡️| [**TabHeader**](doc/wiki/en/Control/TabHeader.md) | ✅ | ❎ |
➡️| [**Pagination**](doc/wiki/en/Control/Pagination.md) | ✅ | ✅ |
➡️| [**Steps**](doc/wiki/en/Control/Steps.md) | ❎ | ❎ |
||||
⬇️| 数据录入 `13` | 动画 | 禁用 |
➡️| [**Checkbox** 多选框](doc/wiki/zh/Control/Checkbox.md) | ✅ | ✅ |
➡️| [**ColorPicker** 颜色选择器](doc/wiki/zh/Control/ColorPicker.md) | ✅ | ✅ |
➡️| [**DatePicker** 日期选择框](doc/wiki/zh/Control/DatePicker.md) | ✅ | ✅ |
➡️| [**DatePickerRange** 日期范围选择框](doc/wiki/zh/Control/DatePicker.md#datepickerrange) | ✅ | ✅ |
➡️| [**Input** 输入框](doc/wiki/zh/Control/Input.md) | ✅ | ✅ |
➡️| [**InputNumber** 数字输入框](doc/wiki/zh/Control/Input.md#inputnumber) | ✅ | ✅ |
➡️| [**Radio** 单选框](doc/wiki/zh/Control/Radio.md) | ✅ | ✅ |
➡️| [**Rate** 评分](doc/wiki/zh/Control/Rate.md) | ✅ | ❎ |
➡️| [**Select** 选择器](doc/wiki/zh/Control/Select.md) | ✅ | ✅ |
➡️| [**Slider** 滑动输入条](doc/wiki/zh/Control/Slider.md) | ✅ | ❎ |
➡️| [**Switch** 开关](doc/wiki/zh/Control/Switch.md) | ✅ | ✅ |
➡️| [**TimePicker** 时间选择框](doc/wiki/zh/Control/TimePicker.md) | ✅ | ✅ |
➡️| [**UploadDragger** 拖拽上传](doc/wiki/zh/Control/UploadDragger.md) | ✅ | ❎ |
⬇️| Data Entry `13` | Animation | Disable |
➡️| [**Checkbox**](doc/wiki/en/Control/Checkbox.md) | ✅ | ✅ |
➡️| [**ColorPicker**](doc/wiki/en/Control/ColorPicker.md) | ✅ | ✅ |
➡️| [**DatePicker**](doc/wiki/en/Control/DatePicker.md) | ✅ | ✅ |
➡️| [**DatePickerRange**](doc/wiki/en/Control/DatePicker.md#datepickerrange) | ✅ | ✅ |
➡️| [**Input**](doc/wiki/en/Control/Input.md) | ✅ | ✅ |
➡️| [**InputNumber**](doc/wiki/en/Control/Input.md#inputnumber) | ✅ | ✅ |
➡️| [**Radio**](doc/wiki/en/Control/Radio.md) | ✅ | ✅ |
➡️| [**Rate**](doc/wiki/en/Control/Rate.md) | ✅ | ❎ |
➡️| [**Select**](doc/wiki/en/Control/Select.md) | ✅ | ✅ |
➡️| [**Slider**](doc/wiki/en/Control/Slider.md) | ✅ | ❎ |
➡️| [**Switch**](doc/wiki/en/Control/Switch.md) | ✅ | ✅ |
➡️| [**TimePicker**](doc/wiki/en/Control/TimePicker.md) | ✅ | ✅ |
➡️| [**UploadDragger**](doc/wiki/en/Control/UploadDragger.md) | ✅ | ❎ |
||||
⬇️| 数据展示 `18` | 动画 | 禁用 |
➡️| [**Avatar** 头像](doc/wiki/zh/Control/Avatar.md) | ❎ | ❎ |
➡️| [**Badge** 徽标数](doc/wiki/zh/Control/Badge.md) | ✅ | ❎ |
➡️| [**Calendar** 日历](doc/wiki/zh/Control/Calendar.md) | ✅ | ❎ |
➡️| [**Panel** 面板](doc/wiki/zh/Control/Panel.md) | ✅ | ❎ |
➡️| [**Carousel** 走马灯](doc/wiki/zh/Control/Carousel.md) | ✅ | ❎ |
➡️| [**Collapse** 折叠面板](doc/wiki/zh/Control/Collapse.md) | ✅ | ❎ |
➡️| [**Preview** 图片预览](doc/wiki/zh/Control/Preview.md) | ✅ | ✅ |
➡️| [**Popover** 气泡卡片](doc/wiki/zh/Control/Popover.md) | ✅ | ❎ |
➡️| [**Segmented** 分段控制器](doc/wiki/zh/Control/Segmented.md) | ✅ | ✅ |
➡️| [**Table** 表格](doc/wiki/zh/Control/Table.md) | ✅ | ❎ |
➡️| [**Tabs** 标签页](doc/wiki/zh/Control/Tabs.md) | ✅ | |
➡️| [**Tag** 标签](doc/wiki/zh/Control/Tag.md) | ✅ | ❎ |
➡️| [**Timeline** 时间轴](doc/wiki/zh/Control/Timeline.md) | ❎ | ❎ |
➡️| [**Tooltip** 文字提示](doc/wiki/zh/Control/Tooltip.md) | ✅ | ❎ |
➡️| [**Tree** 树形控件](doc/wiki/zh/Control/Tree.md) | ✅ | |
➡️| [**Tour** 漫游式引导](doc/wiki/zh/Control/Tour.md) | ✅ | |
➡️| [**Label** 文本](doc/wiki/zh/Control/Label.md) | ✅ | ❎ |
➡️| [**LabelTime** 时间文本](doc/wiki/zh/Control/LabelTime.md) | ✅ | ❎ |
⬇️| Data Display `18` | Animation | Disable |
➡️| [**Avatar**](doc/wiki/en/Control/Avatar.md) | ❎ | ❎ |
➡️| [**Badge**](doc/wiki/en/Control/Badge.md) | ✅ | ❎ |
➡️| [**Calendar**](doc/wiki/en/Control/Calendar.md) | ✅ | ❎ |
➡️| [**Panel**](doc/wiki/en/Control/Panel.md) | ✅ | ❎ |
➡️| [**Carousel**](doc/wiki/en/Control/Carousel.md) | ✅ | ❎ |
➡️| [**Collapse**](doc/wiki/en/Control/Collapse.md) | ✅ | ❎ |
➡️| [**Preview**](doc/wiki/en/Control/Preview.md) | ✅ | ✅ |
➡️| [**Popover**](doc/wiki/en/Control/Popover.md) | ✅ | ❎ |
➡️| [**Segmented**](doc/wiki/en/Control/Segmented.md) | ✅ | ✅ |
➡️| [**Table**](doc/wiki/en/Control/Table.md) | ✅ | ❎ |
➡️| [**Tabs**](doc/wiki/en/Control/Tabs.md) | ✅ | |
➡️| [**Tag**](doc/wiki/en/Control/Tag.md) | ✅ | ❎ |
➡️| [**Timeline**](doc/wiki/en/Control/Timeline.md) | ❎ | ❎ |
➡️| [**Tooltip**](doc/wiki/en/Control/Tooltip.md) | ✅ | ❎ |
➡️| [**Tour**](doc/wiki/en/Control/Tour.md) | ✅ | |
➡️| [**Tree**](doc/wiki/en/Control/Tree.md) | ✅ | |
➡️| [**Label**](doc/wiki/en/Control/Label.md) | ✅ | ❎ |
➡️| [**LabelTime**](doc/wiki/zh/Control/LabelTime.md) | ✅ | ❎ |
||||
⬇️| 反馈 `7` | 动画 | 禁用 |
➡️| [**Alert** 警告提示](doc/wiki/zh/Control/Alert.md) | ✅ | ❎ |
➡️| [**Drawer** 抽屉](doc/wiki/zh/Control/Drawer.md) | ✅ | ❎ |
➡️| [**Message** 全局提示](doc/wiki/zh/Control/Message.md) | ✅ | ❎ |
➡️| [**Modal** 对话框](doc/wiki/zh/Control/Modal.md) | ✅ | ❎ |
➡️| [**Notification** 通知提醒框](doc/wiki/zh/Control/Notification.md) | ✅ | ❎ |
➡️| [**Progress** 进度条](doc/wiki/zh/Control/Progress.md) | ✅ | ❎ |
➡️| [**Spin** 加载中](doc/wiki/zh/Control/Spin.md) | ✅ | ❎ |
⬇️| Feedback `7` | Animation | Disable |
➡️| [**Alert**](doc/wiki/en/Control/Alert.md) | ✅ | ❎ |
➡️| [**Drawer**](doc/wiki/en/Control/Drawer.md) | ✅ | ❎ |
➡️| [**Message**](doc/wiki/en/Control/Message.md) | ✅ | ❎ |
➡️| [**Modal**](doc/wiki/en/Control/Modal.md) | ✅ | ❎ |
➡️| [**Notification**](doc/wiki/en/Control/Notification.md) | ✅ | ❎ |
➡️| [**Progress**](doc/wiki/en/Control/Progress.md) | ✅ | ❎ |
➡️| [**Spin**](doc/wiki/en/Control/Spin.md) | ✅ | ❎ |
⬇️| Chat `2` | Animation | Disable |
➡️| **MsgList** Friend message list | ✅ | ❎ |
➡️| **ChatList** Chat bubble list | ✅ | ❎ |
||||
⬇️| 聊天 `2` | 动画 | 禁用 |
➡️| **MsgList** 好友消息列表 | ✅ | ❎ |
➡️| **ChatList** 气泡聊天列表 | ✅ | ❎ |
||||
| 其他 `5` | 动画 | 禁用 |
➡️| [**Battery** 电量](doc/wiki/zh/Control/Battery.md) | ✅ | ❎ |
➡️| [**Signal** 信号强度](doc/wiki/zh/Control/Signal.md) | ✅ | ❎ |
➡️| [**Shield** 徽章](doc/wiki/zh/Control/Shield.md) | ❎ | ❎ |
➡️| [**ContextMenuStrip** 右键菜单](doc/wiki/zh/Control/ContextMenuStrip.md) | ✅ | ❎ |
➡️| **Image3D** 图片3D | ✅ | ❎ |
⬇️| Other `5` | Animation | Disable |
➡️| [**Battery**](doc/wiki/en/Control/Battery.md) | ✅ | ❎ |
➡️| [**Signal**](doc/wiki/en/Control/Signal.md) | ✅ | ❎ |
➡️| [**Shield**](doc/wiki/en/Control/Shield.md) | ❎ | ❎ |
| [**ContextMenuStrip**](doc/wiki/en/Control/ContextMenuStrip.md) | | |
➡️| **Image3D** | ✅ | ❎ |
### 🐿️ 捐赠
### 🐿️ Donation
![Payment](doc/pre/Payment.png)
### 🎨 截图
### 🎨 Screenshot
#### ChatUI
> 纯GDI不是TextBox等拖控件
> Pure GDI drawing (without inheriting from `TextBox`)
![ChatUI](doc/screenshot/ChatUI.gif)
## 📢 特别声明
AntdUI 项目已加入 [dotNET China](https://gitee.com/dotnetchina) 组织。<br/>
![dotnetchina](https://gitee.com/dotnetchina/home/raw/master/assets/dotnetchina-raw.png "dotNET China LOGO")
🦦 招募小伙伴一起维护项目
🦦

140
README.zh.md Normal file
View File

@@ -0,0 +1,140 @@
<div align="center">
<img height="100" src="src/logo.png">
<h1>AntdUI</h1>
[![NuGet](https://img.shields.io/nuget/v/AntdUI.svg?style=flat-square&label=AntdUI&logo=nuget)](https://www.nuget.org/packages/AntdUI)
[![QQGroup](https://img.shields.io/badge/QQ群-328884096-f74658?style=flat-square&logo=qq)](https://qm.qq.com/cgi-bin/qm/qr?k=ZfuHy4LqYC57DYTWAUWkQD9EjdVfvx3y&jump_from=webapi&authKey=4sAgZN0XlFHx+4MW9PdkiGgg435QfKcQdu5lKi1Fp4PP0O+DL6NaKAcV8ybCLM97)
[![Download](https://img.shields.io/nuget/dt/antdui?style=flat-square)](https://www.nuget.org/packages/AntdUI)
[![AntDesign](https://img.shields.io/badge/AntDesign%20-5.0-1677ff?style=flat-square&logo=antdesign)](https://ant-design.antgroup.com/components/overview-cn)
[![License](https://img.shields.io/badge/license-Apache%202.0-4EB1BA.svg?style=flat-square)](http://www.apache.org/licenses/LICENSE-2.0)
中文・[English](README.md)・[文档](doc/wiki/zh/Home.md)・[更新日志](doc/wiki/zh/UpdateLog.md)・[演示](https://gitee.com/mubaiyanghua/antdui-demo)
</div>
![banner](doc/pre/banner.png)
### 🦄 介绍
基于 Ant Design 设计语言的 WinForm UI 界面库致力于将现代美观的前端设计风格带入到桌面应用程序中。采用纯GDI绘图不需任何图片资源全面支持AOT最低兼容 `.NET Framework 4.0`
### ✨ 特性
- 🌈 高质量抗锯齿文字渲染
- 🎨 纯 GDI 矢量绘图,能打断的舒适动效
- 😍 Emoji 打破黑白界限,增加趣味
- 💎 Winform 上最阴影的阴影效果
- 📦 无边框窗口,拥有原生窗口特性
- 👚 主题配置​,黑白模式
- 🌍 全球化支持
- 🦜 SVG 矢量图
- 👓 DPI 适配
- 🦺 AOT 发布
### 🖥 环境
- .NET 9.0
- .NET 6.0
- .NET Framework4.8
- .NET Framework4.0及以上
### 🌴 控件
⬇️| 通用 `2` | 动画 | 禁用 |
:---:|:--|:--:|:--:|
➡️| [**Button** 按钮](doc/wiki/zh/Control/Button.md) | ✅ | ✅ |
➡️| [**FloatButton** 悬浮按钮](doc/wiki/zh/Control/FloatButton.md) | ✅ | ❎ |
||||
⬇️| 布局 `5` | 动画 | 禁用 |
➡️| [**Divider** 分割线](doc/wiki/zh/Control/Divider.md) | ❎ | ❎ |
➡️| [**StackPanel** 堆栈布局](doc/wiki/zh/Control/StackPanel.md) | ❎ | ❎ |
➡️| [**FlowPanel** 流动布局](doc/wiki/zh/Control/FlowPanel.md) | ❎ | ❎ |
➡️| [**GridPanel** 格栅布局](doc/wiki/zh/Control/GridPanel.md) | ❎ | ❎ |
➡️| [**Splitter** 分隔面板](doc/wiki/zh/Control/Splitter.md) | ❎ | ❎ |
||||
⬇️| 导航 `7` | 动画 | 禁用 |
➡️| [**Breadcrumb** 面包屑](doc/wiki/zh/Control/Breadcrumb.md) | ✅ | ❎ |
➡️| [**Dropdown** 下拉菜单](doc/wiki/zh/Control/Dropdown.md) | ✅ | ✅ |
➡️| [**Menu** 导航菜单](doc/wiki/zh/Control/Menu.md) | ✅ | ❎ |
➡️| [**PageHeader** 页头](doc/wiki/zh/Control/PageHeader.md) | ✅ | ❎ |
➡️| [**TabHeader** 多标签页头](doc/wiki/zh/Control/TabHeader.md) | ✅ | ❎ |
➡️| [**Pagination** 分页](doc/wiki/zh/Control/Pagination.md) | ✅ | ✅ |
➡️| [**Steps** 步骤条](doc/wiki/zh/Control/Steps.md) | ❎ | ❎ |
||||
⬇️| 数据录入 `13` | 动画 | 禁用 |
➡️| [**Checkbox** 多选框](doc/wiki/zh/Control/Checkbox.md) | ✅ | ✅ |
➡️| [**ColorPicker** 颜色选择器](doc/wiki/zh/Control/ColorPicker.md) | ✅ | ✅ |
➡️| [**DatePicker** 日期选择框](doc/wiki/zh/Control/DatePicker.md) | ✅ | ✅ |
➡️| [**DatePickerRange** 日期范围选择框](doc/wiki/zh/Control/DatePicker.md#datepickerrange) | ✅ | ✅ |
➡️| [**Input** 输入框](doc/wiki/zh/Control/Input.md) | ✅ | ✅ |
➡️| [**InputNumber** 数字输入框](doc/wiki/zh/Control/Input.md#inputnumber) | ✅ | ✅ |
➡️| [**Radio** 单选框](doc/wiki/zh/Control/Radio.md) | ✅ | ✅ |
➡️| [**Rate** 评分](doc/wiki/zh/Control/Rate.md) | ✅ | ❎ |
➡️| [**Select** 选择器](doc/wiki/zh/Control/Select.md) | ✅ | ✅ |
➡️| [**Slider** 滑动输入条](doc/wiki/zh/Control/Slider.md) | ✅ | ❎ |
➡️| [**Switch** 开关](doc/wiki/zh/Control/Switch.md) | ✅ | ✅ |
➡️| [**TimePicker** 时间选择框](doc/wiki/zh/Control/TimePicker.md) | ✅ | ✅ |
➡️| [**UploadDragger** 拖拽上传](doc/wiki/zh/Control/UploadDragger.md) | ✅ | ❎ |
||||
⬇️| 数据展示 `18` | 动画 | 禁用 |
➡️| [**Avatar** 头像](doc/wiki/zh/Control/Avatar.md) | ❎ | ❎ |
➡️| [**Badge** 徽标数](doc/wiki/zh/Control/Badge.md) | ✅ | ❎ |
➡️| [**Calendar** 日历](doc/wiki/zh/Control/Calendar.md) | ✅ | ❎ |
➡️| [**Panel** 面板](doc/wiki/zh/Control/Panel.md) | ✅ | ❎ |
➡️| [**Carousel** 走马灯](doc/wiki/zh/Control/Carousel.md) | ✅ | ❎ |
➡️| [**Collapse** 折叠面板](doc/wiki/zh/Control/Collapse.md) | ✅ | ❎ |
➡️| [**Preview** 图片预览](doc/wiki/zh/Control/Preview.md) | ✅ | ✅ |
➡️| [**Popover** 气泡卡片](doc/wiki/zh/Control/Popover.md) | ✅ | ❎ |
➡️| [**Segmented** 分段控制器](doc/wiki/zh/Control/Segmented.md) | ✅ | ✅ |
➡️| [**Table** 表格](doc/wiki/zh/Control/Table.md) | ✅ | ❎ |
➡️| [**Tabs** 标签页](doc/wiki/zh/Control/Tabs.md) | ✅ | ✅ |
➡️| [**Tag** 标签](doc/wiki/zh/Control/Tag.md) | ✅ | ❎ |
➡️| [**Timeline** 时间轴](doc/wiki/zh/Control/Timeline.md) | ❎ | ❎ |
➡️| [**Tooltip** 文字提示](doc/wiki/zh/Control/Tooltip.md) | ✅ | ❎ |
➡️| [**Tree** 树形控件](doc/wiki/zh/Control/Tree.md) | ✅ | ✅ |
➡️| [**Tour** 漫游式引导](doc/wiki/zh/Control/Tour.md) | ✅ | ❎ |
➡️| [**Label** 文本](doc/wiki/zh/Control/Label.md) | ✅ | ❎ |
➡️| [**LabelTime** 时间文本](doc/wiki/zh/Control/LabelTime.md) | ✅ | ❎ |
||||
⬇️| 反馈 `7` | 动画 | 禁用 |
➡️| [**Alert** 警告提示](doc/wiki/zh/Control/Alert.md) | ✅ | ❎ |
➡️| [**Drawer** 抽屉](doc/wiki/zh/Control/Drawer.md) | ✅ | ❎ |
➡️| [**Message** 全局提示](doc/wiki/zh/Control/Message.md) | ✅ | ❎ |
➡️| [**Modal** 对话框](doc/wiki/zh/Control/Modal.md) | ✅ | ❎ |
➡️| [**Notification** 通知提醒框](doc/wiki/zh/Control/Notification.md) | ✅ | ❎ |
➡️| [**Progress** 进度条](doc/wiki/zh/Control/Progress.md) | ✅ | ❎ |
➡️| [**Spin** 加载中](doc/wiki/zh/Control/Spin.md) | ✅ | ❎ |
||||
⬇️| 聊天 `2` | 动画 | 禁用 |
➡️| **MsgList** 好友消息列表 | ✅ | ❎ |
➡️| **ChatList** 气泡聊天列表 | ✅ | ❎ |
||||
⬇️| 其他 `5` | 动画 | 禁用 |
➡️| [**Battery** 电量](doc/wiki/zh/Control/Battery.md) | ✅ | ❎ |
➡️| [**Signal** 信号强度](doc/wiki/zh/Control/Signal.md) | ✅ | ❎ |
➡️| [**Shield** 徽章](doc/wiki/zh/Control/Shield.md) | ❎ | ❎ |
➡️| [**ContextMenuStrip** 右键菜单](doc/wiki/zh/Control/ContextMenuStrip.md) | ✅ | ❎ |
➡️| **Image3D** 图片3D | ✅ | ❎ |
### 🐿️ 捐赠
![Payment](doc/pre/Payment.png)
### 🎨 截图
#### ChatUI
> 纯GDI不是TextBox等拖控件
![ChatUI](doc/screenshot/ChatUI.gif)
## 📢 特别声明
AntdUI 项目已加入 [dotNET China](https://gitee.com/dotnetchina) 组织。<br/>
![dotnetchina](https://gitee.com/dotnetchina/home/raw/master/assets/dotnetchina-raw.png "dotNET China LOGO")
🦦 招募小伙伴一起维护项目

BIN
doc/wiki/en/Img/PR_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

BIN
doc/wiki/en/Img/PR_2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

BIN
doc/wiki/en/Img/PR_3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
doc/wiki/en/Img/PR_4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
doc/wiki/en/Img/PR_5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

BIN
doc/wiki/en/Img/PR_6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
doc/wiki/en/Img/PR_7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

BIN
doc/wiki/en/Img/PR_8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

View File

@@ -33,7 +33,7 @@
### 4. 提交贡献代码到自己仓库
> 打开VS克隆刚刚复制的地址,选择目录,点击 **克隆** 继续
> 打开 [Visual Studio](https://visualstudio.microsoft.com) 克隆刚刚复制的地址,选择目录,点击 **克隆** 继续
![6](Img/PR_6.png)

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

View File

@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
@@ -26,36 +26,36 @@
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->

View File

@@ -283,7 +283,7 @@ namespace Demo.Controls
colorPicker.Location = new System.Drawing.Point(102, 106);
colorPicker.Name = "colorPicker";
colorPicker.ShowText = true;
colorPicker.Size = new System.Drawing.Size(124, 45);
colorPicker.Size = new System.Drawing.Size(125, 46);
colorPicker.TabIndex = 27;
colorPicker.Value = System.Drawing.Color.Black;
colorPicker.ValueChanged += colorPicker_ValueChanged;
@@ -301,7 +301,6 @@ namespace Demo.Controls
//
// Watermark
//
AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
Controls.Add(panel1);
Controls.Add(header1);
Font = new System.Drawing.Font("Microsoft YaHei UI", 12F);

View File

@@ -18,13 +18,7 @@
// QQ: 17379620
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Demo.Controls

Binary file not shown.

View File

@@ -133,7 +133,7 @@ namespace Demo {
}
/// <summary>
/// 查找类似 &lt;svg viewBox=&quot;0 0 1024 1024&quot;&gt;&lt;path d=&quot;M830 194m-118 0a118 118 0 1 0 236 0 118 118 0 1 0-236 0Z&quot; fill=&quot;#91D5FF&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M840.8 716.8m-70.8 0a70.8 70.8 0 1 0 141.6 0 70.8 70.8 0 1 0-141.6 0Z&quot; fill=&quot;#91D5FF&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M287.8 470.8m-70.8 0a70.8 70.8 0 1 0 141.6 0 70.8 70.8 0 1 0-141.6 0Z&quot; fill=&quot;#91D5FF&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M595.6 428.6m-141.6 0a141.6 141.6 0 1 0 283.2 0 141.6 141.6 0 1 0-283.2 0Z&quot; fill=&quot;#1890FF&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M194 760m-118 0a118 118 0 1 0 236 0 118 118 0 1 0-236 0Z&quot; fill=&quot;#1890FF&quot;&gt;&lt; [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// 查找类似 &lt;svg viewBox=&quot;0 0 1024 1024&quot;&gt;&lt;path d=&quot;M428.501333 64a64 64 0 0 1 64 64v42.666667a64 64 0 0 1-64 64H128A64 64 0 0 1 64 170.666667V128A64 64 0 0 1 128 64h300.501333z&quot; fill=&quot;#29C287&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M896 305.92a64 64 0 0 1 64 64v42.666667a64 64 0 0 1-64 64H128a64 64 0 0 1-64-64v-42.666667A64 64 0 0 1 128 305.92h768z&quot; fill=&quot;#706EE7&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M584.362667 547.413333a64 64 0 0 1 64 64v42.666667a64 64 0 0 1-64 64H128a64 64 0 0 1-64-64v-42.666667a64 64 0 0 1 64-64h456.362667z&quot; fill=&quot;#29C287&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Chart {
get {

View File

@@ -271,6 +271,6 @@
<value>&lt;svg viewBox="0 0 194 116" xmlns:xlink="http://www.w3.org/1999/xlink"&gt;&lt;defs&gt;&lt;rect id="path-1" x="0" y="0" width="194" height="116" rx="6.4000001"&gt;&lt;/rect&gt;&lt;/defs&gt;&lt;g id="组件骨架图更新" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"&gt;&lt;g id="🎉-5.0-新版---黑" transform="translate(-521.000000, -5481.000000)"&gt;&lt;g id="Ant-Design-5.0" transform="translate(521.000000, 5481.000000)"&gt;&lt;mask id="mask-2" fill="white"&gt;&lt;use xlink:href="#path-1"&gt;&lt;/use&gt;&lt;/mask&gt;&lt;use id="蒙版" fill="#1F1F1F" xlink:href="#path-1"&gt;&lt;/use&gt;&lt;text mask="url(#mask-2)" transform="translate(50.227928, 32.794879) rotate(-32.000000) translate(-50.227928, -32.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#FFFFFF" fill-opacity="0.12"&gt;&lt;tspan x="-4.77207214" y="38.7948789"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份-7" mask="url(#mask-2)" transform="translate(18.227928, 3.794879) rotate(-32.000000) translate(-18.227928, -3.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#FFFFFF" fill-opacity="0.12"&gt;&lt;tspan x="-36.7720721" y="9.7948789"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份" mask="url(#mask-2)" transform="translate(83.227928, 59.794879) rotate(-32.000000) translate(-83.227928, -59.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#FFFFFF" fill-opacity="0.12"&gt;&lt;tspan x="28.2279279" y="65.7948789"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份-8" mask="url(#mask-2)" transform="translate(-28.772072, 130.794879) rotate(-32.000000) translate(28.772072, -130.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#FFFFFF" fill-opacity="0.12"&gt;&lt;tspan x="-83.7720721" y="136.794879"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份-5" mask="url(#mask-2)" transform="translate(52.227928, 127.794879) rotate(-32.000000) translate(-52.227928, -127.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#FFFFFF" fill-opacity="0.12"&gt;&lt;tspan x="-2.77207214" y="133.794879"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份-3" mask="url(#mask-2)" transform="translate(107.227928, 135.794879) rotate(-32.000000) translate(-107.227928, -135.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#FFFFFF" fill-opacity="0.12"&gt;&lt;tspan x="52.2279279" y="141.794879"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份-2" mask="url(#mask-2)" transform="translate(195.227928, -9.205121) rotate(-32.000000) translate(-195.227928, 9.205121) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#FFFFFF" fill-opacity="0.12"&gt;&lt;tspan x="140.227928" y="-3.2051211"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份-6" mask="url(#mask-2)" transform="translate(164.227928, 57.794879) rotate(-32.000000) translate(-164.227928, -57.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#FFFFFF" fill-opacity="0.12"&gt;&lt;tspan x="109.227928" y="63.7948789"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份-4" mask="url(#mask-2)" transform="translate(226.227928, 61.794879) rotate(-32.000000) translate(-226.227928, -61.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#FFFFFF" fill-opacity="0.12"&gt;&lt;tspan x="171.227928" y="67.7948789"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;</value>
</data>
<data name="Chart" xml:space="preserve">
<value>&lt;svg viewBox="0 0 1024 1024"&gt;&lt;path d="M830 194m-118 0a118 118 0 1 0 236 0 118 118 0 1 0-236 0Z" fill="#91D5FF"&gt;&lt;/path&gt;&lt;path d="M840.8 716.8m-70.8 0a70.8 70.8 0 1 0 141.6 0 70.8 70.8 0 1 0-141.6 0Z" fill="#91D5FF"&gt;&lt;/path&gt;&lt;path d="M287.8 470.8m-70.8 0a70.8 70.8 0 1 0 141.6 0 70.8 70.8 0 1 0-141.6 0Z" fill="#91D5FF"&gt;&lt;/path&gt;&lt;path d="M595.6 428.6m-141.6 0a141.6 141.6 0 1 0 283.2 0 141.6 141.6 0 1 0-283.2 0Z" fill="#1890FF"&gt;&lt;/path&gt;&lt;path d="M194 760m-118 0a118 118 0 1 0 236 0 118 118 0 1 0-236 0Z" fill="#1890FF"&gt;&lt;/path&gt;&lt;path d="M382.8 241.2m-70.8 0a70.8 70.8 0 1 0 141.6 0 70.8 70.8 0 1 0-141.6 0Z" fill="#1890FF"&gt;&lt;/path&gt;&lt;path d="M547.8 806.8m-70.8 0a70.8 70.8 0 1 0 141.6 0 70.8 70.8 0 1 0-141.6 0Z" fill="#1890FF"&gt;&lt;/path&gt;&lt;/svg&gt;</value>
<value>&lt;svg viewBox="0 0 1024 1024"&gt;&lt;path d="M428.501333 64a64 64 0 0 1 64 64v42.666667a64 64 0 0 1-64 64H128A64 64 0 0 1 64 170.666667V128A64 64 0 0 1 128 64h300.501333z" fill="#29C287"&gt;&lt;/path&gt;&lt;path d="M896 305.92a64 64 0 0 1 64 64v42.666667a64 64 0 0 1-64 64H128a64 64 0 0 1-64-64v-42.666667A64 64 0 0 1 128 305.92h768z" fill="#706EE7"&gt;&lt;/path&gt;&lt;path d="M584.362667 547.413333a64 64 0 0 1 64 64v42.666667a64 64 0 0 1-64 64H128a64 64 0 0 1-64-64v-42.666667a64 64 0 0 1 64-64h456.362667z" fill="#29C287"&gt;&lt;/path&gt;&lt;path d="M311.637333 789.333333a64 64 0 0 1 64 64v42.666667a64 64 0 0 1-64 64H128A64 64 0 0 1 64 896v-42.666667A64 64 0 0 1 128 789.333333h183.637333z" fill="#706EE7"&gt;&lt;/path&gt;&lt;/svg&gt;</value>
</data>
</root>

View File

@@ -133,7 +133,7 @@ namespace Demo {
}
/// <summary>
/// 查找类似 &lt;svg viewBox=&quot;0 0 1024 1024&quot;&gt;&lt;path d=&quot;M830 194m-118 0a118 118 0 1 0 236 0 118 118 0 1 0-236 0Z&quot; fill=&quot;#91D5FF&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M840.8 716.8m-70.8 0a70.8 70.8 0 1 0 141.6 0 70.8 70.8 0 1 0-141.6 0Z&quot; fill=&quot;#91D5FF&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M287.8 470.8m-70.8 0a70.8 70.8 0 1 0 141.6 0 70.8 70.8 0 1 0-141.6 0Z&quot; fill=&quot;#91D5FF&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M595.6 428.6m-141.6 0a141.6 141.6 0 1 0 283.2 0 141.6 141.6 0 1 0-283.2 0Z&quot; fill=&quot;#1890FF&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M194 760m-118 0a118 118 0 1 0 236 0 118 118 0 1 0-236 0Z&quot; fill=&quot;#1890FF&quot;&gt;&lt; [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// 查找类似 &lt;svg viewBox=&quot;0 0 1024 1024&quot;&gt;&lt;path d=&quot;M428.501333 64a64 64 0 0 1 64 64v42.666667a64 64 0 0 1-64 64H128A64 64 0 0 1 64 170.666667V128A64 64 0 0 1 128 64h300.501333z&quot; fill=&quot;#29C287&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M896 305.92a64 64 0 0 1 64 64v42.666667a64 64 0 0 1-64 64H128a64 64 0 0 1-64-64v-42.666667A64 64 0 0 1 128 305.92h768z&quot; fill=&quot;#706EE7&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M584.362667 547.413333a64 64 0 0 1 64 64v42.666667a64 64 0 0 1-64 64H128a64 64 0 0 1-64-64v-42.666667a64 64 0 0 1 64-64h456.362667z&quot; fill=&quot;#29C287&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M [字符串的其余部分被截断]&quot;; 的本地化字符串。
/// </summary>
internal static string Chart {
get {

View File

@@ -271,6 +271,6 @@
<value>&lt;svg viewBox="0 0 196 118" xmlns:xlink="http://www.w3.org/1999/xlink"&gt;&lt;defs&gt;&lt;rect id="path-1" x="0" y="0" width="194" height="116" rx="6.4000001"&gt;&lt;/rect&gt;&lt;/defs&gt;&lt;g id="组件骨架图更新" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"&gt;&lt;g id="🎉-5.0-新版" transform="translate(-520.000000, -5480.000000)"&gt;&lt;g id="Ant-Design-5.0" transform="translate(521.000000, 5481.000000)"&gt;&lt;mask id="mask-2" fill="white"&gt;&lt;use xlink:href="#path-1"&gt;&lt;/use&gt;&lt;/mask&gt;&lt;use id="蒙版" stroke="#F0F0F0" stroke-width="0.8" fill="#FFFFFF" fill-rule="nonzero" xlink:href="#path-1"&gt;&lt;/use&gt;&lt;text mask="url(#mask-2)" transform="translate(50.227928, 32.794879) rotate(-32.000000) translate(-50.227928, -32.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#000000" fill-opacity="0.12"&gt;&lt;tspan x="-4.77207214" y="38.7948789"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份-7" mask="url(#mask-2)" transform="translate(18.227928, 3.794879) rotate(-32.000000) translate(-18.227928, -3.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#000000" fill-opacity="0.12"&gt;&lt;tspan x="-36.7720721" y="9.7948789"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份" mask="url(#mask-2)" transform="translate(83.227928, 59.794879) rotate(-32.000000) translate(-83.227928, -59.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#000000" fill-opacity="0.12"&gt;&lt;tspan x="28.2279279" y="65.7948789"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份-8" mask="url(#mask-2)" transform="translate(-28.772072, 130.794879) rotate(-32.000000) translate(28.772072, -130.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#000000" fill-opacity="0.12"&gt;&lt;tspan x="-83.7720721" y="136.794879"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份-5" mask="url(#mask-2)" transform="translate(52.227928, 127.794879) rotate(-32.000000) translate(-52.227928, -127.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#000000" fill-opacity="0.12"&gt;&lt;tspan x="-2.77207214" y="133.794879"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份-3" mask="url(#mask-2)" transform="translate(107.227928, 135.794879) rotate(-32.000000) translate(-107.227928, -135.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#000000" fill-opacity="0.12"&gt;&lt;tspan x="52.2279279" y="141.794879"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份-2" mask="url(#mask-2)" transform="translate(195.227928, -9.205121) rotate(-32.000000) translate(-195.227928, 9.205121) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#000000" fill-opacity="0.12"&gt;&lt;tspan x="140.227928" y="-3.2051211"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份-6" mask="url(#mask-2)" transform="translate(164.227928, 57.794879) rotate(-32.000000) translate(-164.227928, -57.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#000000" fill-opacity="0.12"&gt;&lt;tspan x="109.227928" y="63.7948789"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;text id="Ant-Design-5.0备份-4" mask="url(#mask-2)" transform="translate(226.227928, 61.794879) rotate(-32.000000) translate(-226.227928, -61.794879) " font-family="PingFangSC-Regular, PingFang SC" font-size="16" font-weight="normal" fill="#000000" fill-opacity="0.12"&gt;&lt;tspan x="171.227928" y="67.7948789"&gt;Ant Design 5.0&lt;/tspan&gt;&lt;/text&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;</value>
</data>
<data name="Chart" xml:space="preserve">
<value>&lt;svg viewBox="0 0 1024 1024"&gt;&lt;path d="M830 194m-118 0a118 118 0 1 0 236 0 118 118 0 1 0-236 0Z" fill="#91D5FF"&gt;&lt;/path&gt;&lt;path d="M840.8 716.8m-70.8 0a70.8 70.8 0 1 0 141.6 0 70.8 70.8 0 1 0-141.6 0Z" fill="#91D5FF"&gt;&lt;/path&gt;&lt;path d="M287.8 470.8m-70.8 0a70.8 70.8 0 1 0 141.6 0 70.8 70.8 0 1 0-141.6 0Z" fill="#91D5FF"&gt;&lt;/path&gt;&lt;path d="M595.6 428.6m-141.6 0a141.6 141.6 0 1 0 283.2 0 141.6 141.6 0 1 0-283.2 0Z" fill="#1890FF"&gt;&lt;/path&gt;&lt;path d="M194 760m-118 0a118 118 0 1 0 236 0 118 118 0 1 0-236 0Z" fill="#1890FF"&gt;&lt;/path&gt;&lt;path d="M382.8 241.2m-70.8 0a70.8 70.8 0 1 0 141.6 0 70.8 70.8 0 1 0-141.6 0Z" fill="#1890FF"&gt;&lt;/path&gt;&lt;path d="M547.8 806.8m-70.8 0a70.8 70.8 0 1 0 141.6 0 70.8 70.8 0 1 0-141.6 0Z" fill="#1890FF"&gt;&lt;/path&gt;&lt;/svg&gt;</value>
<value>&lt;svg viewBox="0 0 1024 1024"&gt;&lt;path d="M428.501333 64a64 64 0 0 1 64 64v42.666667a64 64 0 0 1-64 64H128A64 64 0 0 1 64 170.666667V128A64 64 0 0 1 128 64h300.501333z" fill="#29C287"&gt;&lt;/path&gt;&lt;path d="M896 305.92a64 64 0 0 1 64 64v42.666667a64 64 0 0 1-64 64H128a64 64 0 0 1-64-64v-42.666667A64 64 0 0 1 128 305.92h768z" fill="#706EE7"&gt;&lt;/path&gt;&lt;path d="M584.362667 547.413333a64 64 0 0 1 64 64v42.666667a64 64 0 0 1-64 64H128a64 64 0 0 1-64-64v-42.666667a64 64 0 0 1 64-64h456.362667z" fill="#29C287"&gt;&lt;/path&gt;&lt;path d="M311.637333 789.333333a64 64 0 0 1 64 64v42.666667a64 64 0 0 1-64 64H128A64 64 0 0 1 64 896v-42.666667A64 64 0 0 1 128 789.333333h183.637333z" fill="#706EE7"&gt;&lt;/path&gt;&lt;/svg&gt;</value>
</data>
</root>

View File

@@ -13,7 +13,7 @@
<Description>👚 基于 Ant Design 设计语言的 Winform 界面库</Description>
<AssemblyVersion>$(Version)</AssemblyVersion>
<FileVersion>$(Version)</FileVersion>
<Version>2.1.0</Version>
<Version>2.1.1</Version>
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
<LangVersion>9.0</LangVersion>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>

View File

@@ -17,7 +17,6 @@
// CSDN: https://blog.csdn.net/v_132
// QQ: 17379620
using System;
using System.ComponentModel;
using System.Drawing;

View File

@@ -17,7 +17,6 @@
// CSDN: https://blog.csdn.net/v_132
// QQ: 17379620
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;

View File

@@ -20,7 +20,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Drawing.Design;
using System.Drawing.Drawing2D;
@@ -53,15 +52,6 @@ namespace AntdUI.Controls.Charts
public Chart() : base(ControlType.Default)
{
base.BackColor = Color.White;
SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw |
ControlStyles.DoubleBuffer |
ControlStyles.SupportsTransparentBackColor |
ControlStyles.UserPaint, true);
UpdateStyles();
// 初始化动画定时器
animationTimer = new System.Windows.Forms.Timer();
animationTimer.Interval = 16; // 60 FPS
@@ -76,10 +66,7 @@ namespace AntdUI.Controls.Charts
protected override void Dispose(bool disposing)
{
if (disposing)
{
animationTimer?.Dispose();
}
if (disposing) animationTimer?.Dispose();
base.Dispose(disposing);
}
@@ -304,7 +291,7 @@ namespace AntdUI.Controls.Charts
// 将控件坐标转换为屏幕坐标
var screenLocation = location;
// 创建tooltip配置使用屏幕坐标
var config = new Tooltip.Config(this, tooltipText)
{
@@ -337,8 +324,6 @@ namespace AntdUI.Controls.Charts
}
}
public event EventHandler? Disposed;
#endregion
#region
@@ -668,11 +653,11 @@ namespace AntdUI.Controls.Charts
var colorBoxWidth = 15;
var colorBoxSpacing = 10;
var padding = 5;
// 计算最大文本宽度和总高度
var maxTextWidth = 0;
var totalHeight = padding;
foreach (var item in legendItems)
{
var textSize = g.MeasureString(item.Label, Font);
@@ -680,17 +665,17 @@ namespace AntdUI.Controls.Charts
var itemHeight = Math.Max(15, (int)textSize.Height);
totalHeight += itemHeight + itemSpacing;
}
// 减去最后一个间距
if (legendItems.Count > 0)
{
totalHeight -= itemSpacing;
}
totalHeight += padding;
// 计算总宽度:左边距 + 颜色框宽度 + 间距 + 文本宽度 + 右边距
var totalWidth = padding + colorBoxWidth + colorBoxSpacing + maxTextWidth + padding;
return new Size(totalWidth, totalHeight);
}
@@ -817,7 +802,7 @@ namespace AntdUI.Controls.Charts
private void HandleMouseMove(Point location)
{
if (!ShowTooltip) return;
var chartRect = CalculateChartRect(ClientRectangle);
if (chartRect.Contains(location))
{
@@ -829,9 +814,9 @@ namespace AntdUI.Controls.Charts
{
HoveredPoint = point;
ShowTooltipInternal(point, location);
PointHover?.Invoke(this, new ChartPointHoverEventArgs(point, location));
PointHover?.Invoke(this, new ChartPointHoverEventArgs(point, location));
}
}
}
else
{
// 没有找到数据点时隐藏tooltip
@@ -1195,13 +1180,13 @@ namespace AntdUI.Controls.Charts
var sweepAngle = (float)(Math.Abs(point.Y) / totalValue * 360 * AnimationProgress);
var color = point.Color.HasValue ? point.Color.Value : colors[i % colors.Length];
using (var brush = new SolidBrush(color))
using (var pen = new Pen(Color.White, 2))
{
var rect = new Rectangle((int)(centerX - radius), (int)(centerY - radius), (int)(radius * 2), (int)(radius * 2));
g.FillPie(brush, rect, startAngle, sweepAngle);
g.DrawPie(pen, rect, startAngle, sweepAngle);
}
using (var brush = new SolidBrush(color))
using (var pen = new Pen(Color.White, 2))
{
var rect = new Rectangle(centerX - radius, centerY - radius, radius * 2, radius * 2);
g.FillPie(brush, rect, startAngle, sweepAngle);
g.DrawPie(pen, rect, startAngle, sweepAngle);
}
// 绘制标签
if (!string.IsNullOrEmpty(point.Label))
@@ -1261,7 +1246,7 @@ namespace AntdUI.Controls.Charts
using (var pen = new Pen(Color.White, 2))
{
// 绘制外圆
var outerRect = new Rectangle((int)(centerX - outerRadius), (int)(centerY - outerRadius), (int)(outerRadius * 2), (int)(outerRadius * 2));
var outerRect = new Rectangle(centerX - outerRadius, centerY - outerRadius, outerRadius * 2, outerRadius * 2);
g.FillPie(brush, outerRect, startAngle, sweepAngle);
// 绘制内圆(挖空)
@@ -1495,8 +1480,8 @@ namespace AntdUI.Controls.Charts
using (var pen = new Pen(color, 2))
{
// 确保矩形尺寸有效
var rect = new Rectangle((int)(centerX - radius), (int)(centerY - radius), radius * 2, radius * 2);
var rect = new Rectangle(centerX - radius, centerY - radius, radius * 2, radius * 2);
// 检查矩形是否有效
if (rect.Width > 0 && rect.Height > 0)
{

View File

@@ -234,25 +234,19 @@ namespace AntdUI.Chat
{
if (it.Visible && it.Contains(e.Location, 0, ScrollBar.Value, out _))
{
// 处理不同类型的点击事件
if (e.Button == MouseButtons.Right)
{
// 右键点击
OnItemRightClick(it);
}
else if (e.Button == MouseButtons.Left)
if (e.Button == MouseButtons.Left)
{
// 左键点击
it.Select = true;
OnItemSelected(it);
// 检查是否为双击
if (e.Clicks == 2)
if (e.Clicks > 1)
{
OnItemDoubleClick(it);
OnItemClick(it, e);
OnItemDoubleClick(it, e);
return;
}
}
// 触发通用点击事件
OnItemClick(it, e);
return;
@@ -332,44 +326,24 @@ namespace AntdUI.Chat
/// </summary>
[Description("项目选中事件"), Category("行为")]
public event ItemSelectedEventHandler? ItemSelected;
/// <summary>
/// 项目双击事件
/// </summary>
[Description("项目双击事件"), Category("行为")]
public event ItemSelectedEventHandler? ItemDoubleClick;
/// <summary>
/// 项目右键点击事件
/// </summary>
[Description("项目右键点击事件"), Category("行为")]
public event ItemSelectedEventHandler? ItemRightClick;
/// <summary>
/// 项目点击事件(包含鼠标信息)
/// </summary>
[Description("项目点击事件"), Category("行为")]
public event ItemClickEventHandler? ItemClick;
protected virtual void OnItemSelected(MsgItem selectedItem)
{
ItemSelected?.Invoke(this, new MsgItemEventArgs(selectedItem));
}
protected virtual void OnItemDoubleClick(MsgItem selectedItem)
{
ItemDoubleClick?.Invoke(this, new MsgItemEventArgs(selectedItem));
}
protected virtual void OnItemRightClick(MsgItem selectedItem)
{
ItemRightClick?.Invoke(this, new MsgItemEventArgs(selectedItem));
}
protected virtual void OnItemClick(MsgItem selectedItem, MouseEventArgs e)
{
ItemClick?.Invoke(this, new MsgItemClickEventArgs(selectedItem, e));
}
/// <summary>
/// 项目双击事件
/// </summary>
[Description("项目双击事件"), Category("行为")]
public event ItemClickEventHandler? ItemDoubleClick;
protected virtual void OnItemSelected(MsgItem selectedItem) => ItemSelected?.Invoke(this, new MsgItemEventArgs(selectedItem));
protected virtual void OnItemClick(MsgItem selectedItem, MouseEventArgs e) => ItemClick?.Invoke(this, new MsgItemClickEventArgs(selectedItem, e));
protected virtual void OnItemDoubleClick(MsgItem selectedItem, MouseEventArgs e) => ItemDoubleClick?.Invoke(this, new MsgItemClickEventArgs(selectedItem, e));
#endregion

View File

@@ -1078,6 +1078,9 @@ namespace AntdUI
BackActiveExtend = item.BackActiveExtend;
}
/// <summary>
/// 线条布局
/// </summary>
public ObjectItem(int i, Rectangle rect)
{
I = i;

View File

@@ -17,13 +17,12 @@
// CSDN: https://blog.csdn.net/v_132
// QQ: 17379620
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Windows.Forms;
using Microsoft.Win32;
namespace AntdUI
{
@@ -172,7 +171,7 @@ namespace AntdUI
{
// 创建新的水印窗体
var watermarkForm = new LayeredFormWatermark(config);
// 显示水印
watermarkForm.Show(config.Target);
@@ -240,7 +239,7 @@ namespace AntdUI
config.Target.LocationChanged += Target_LocationChanged;
config.Target.SizeChanged += Target_SizeChanged;
config.Target.VisibleChanged += Target_VisibleChanged;
// 监听父容器的移动事件
var parent = config.Target.Parent;
while (parent != null)
@@ -249,7 +248,7 @@ namespace AntdUI
parent.SizeChanged += Parent_SizeChanged;
parent = parent.Parent;
}
// 监听Form的移动事件
var form = GetTopLevelForm(config.Target);
if (form != null)
@@ -450,8 +449,8 @@ namespace AntdUI
var imageAttributes = new ImageAttributes();
imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
g.DrawImage(config.Image,
new Rectangle((int)drawX, (int)drawY, (int)imageWidth, (int)imageHeight),
g.DrawImage(config.Image,
new Rectangle((int)drawX, (int)drawY, imageWidth, imageHeight),
0, 0, config.Image.Width, config.Image.Height,
GraphicsUnit.Pixel, imageAttributes);
@@ -472,21 +471,21 @@ namespace AntdUI
var contentHeight = (float)config.Height;
var subContentHeight = 0f;
var spacing = 4f; // 主内容和副内容之间的间距
if (!string.IsNullOrEmpty(config.SubContent))
{
// 如果有副内容,计算实际需要的空间
var subFont = new Font(config.Font.FontFamily, config.Font.FontSize * 0.8f, config.Font.FontStyle);
// 测量主内容文字高度
var mainSize = g.MeasureString(config.Content, font, config.Width, format);
// 测量副内容文字高度
var subSize = g.MeasureString(config.SubContent, subFont, config.Width, format);
// 计算总高度
var totalTextHeight = mainSize.Height + spacing + subSize.Height;
// 如果总高度超过水印高度,则按比例缩放
if (totalTextHeight > config.Height)
{
@@ -500,7 +499,7 @@ namespace AntdUI
contentHeight = mainSize.Height;
subContentHeight = subSize.Height;
}
subFont.Dispose();
}
@@ -509,14 +508,14 @@ namespace AntdUI
var startY = y + (config.Height - totalHeight) / 2f;
// 绘制主内容
var mainRect = new RectangleF((float)x, startY, (float)config.Width, contentHeight);
var mainRect = new RectangleF(x, startY, config.Width, contentHeight);
g.DrawString(config.Content, font, brush, mainRect, format);
// 绘制副内容
if (!string.IsNullOrEmpty(config.SubContent))
{
var subFont = new Font(config.Font.FontFamily, config.Font.FontSize * 0.8f, config.Font.FontStyle);
var subRect = new RectangleF((float)x, startY + contentHeight + spacing, (float)config.Width, subContentHeight);
var subRect = new RectangleF(x, startY + contentHeight + spacing, config.Width, subContentHeight);
g.DrawString(config.SubContent, subFont, brush, subRect, format);
subFont.Dispose();
}
@@ -532,7 +531,7 @@ namespace AntdUI
config.Target.LocationChanged -= Target_LocationChanged;
config.Target.SizeChanged -= Target_SizeChanged;
config.Target.VisibleChanged -= Target_VisibleChanged;
// 移除父容器的事件监听
var parent = config.Target.Parent;
while (parent != null)
@@ -541,7 +540,7 @@ namespace AntdUI
parent.SizeChanged -= Parent_SizeChanged;
parent = parent.Parent;
}
// 移除Form的事件监听
var form = GetTopLevelForm(config.Target);
if (form != null)

View File

@@ -20,7 +20,6 @@
using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing.Design;
using System.Windows.Forms.Design;
@@ -45,4 +44,4 @@ namespace AntdUI.Design
return value;
}
}
}
}

View File

@@ -1,4 +1,4 @@
// COPYRIGHT (C) Tom. ALL RIGHTS RESERVED.
// COPYRIGHT (C) Tom. ALL RIGHTS RESERVED.
// THE AntdUI PROJECT IS AN WINFORM LIBRARY LICENSED UNDER THE Apache-2.0 License.
// LICENSED UNDER THE Apache License, VERSION 2.0 (THE "License")
// YOU MAY NOT USE THIS FILE EXCEPT IN COMPLIANCE WITH THE License.
@@ -1122,7 +1122,7 @@ namespace AntdUI
/// 项目选中事件处理器
/// </summary>
public delegate void ItemSelectedEventHandler(object sender, MsgItemEventArgs e);
/// <summary>
/// 项目点击事件处理器
/// </summary>

View File

@@ -659,8 +659,9 @@ namespace AntdUI
{
var text = obj.ToString();
if (text == null) return 0;
var size = g.MeasureText(text, Font);
return size.Width;
var tmp = g.MeasureText(text, Font).Width;
if (CloseIcon) tmp += text_height + icon_gap;
return tmp;
}
}
ObjectItem ItemC(object value, int i, ref int item_count, ref int divider_count, ref int y, int padd, int padd2, int sp, int gap_x, int gap_x2, int icon_size, int icon_gap, int icon_xy, int item_height, int text_height, int maxwr, ref int sy, bool no_id = true)
@@ -707,7 +708,16 @@ namespace AntdUI
}
item.RectText = new Rectangle(rect.X + ux, rect.Y, rect.Width - uw, rect.Height);
}
else item = new ObjectItem(value, i, rect, new Rectangle(rect.X + gap_x, rect.Y, rect.Width - gap_x2, rect.Height)) { NoIndex = no_id };
else
{
if (CloseIcon)
{
int dot_xy = (item_height - text_height) / 2;
var rect_close = new Rectangle(rect.Right - gap_x - text_height + dot_xy, rect.Y + dot_xy, text_height, text_height);
item = new ObjectItem(value, i, rect, new Rectangle(rect.X + gap_x, rect.Y, rect.Width - gap_x2 - text_height, rect.Height)) { NoIndex = no_id, RectClose = rect_close };
}
else item = new ObjectItem(value, i, rect, new Rectangle(rect.X + gap_x, rect.Y, rect.Width - gap_x2, rect.Height)) { NoIndex = no_id };
}
if (selectedValue == item.Tag) sy = y;
y += item_height;
}