一个基于 .NET 6.0-windows 的 WPF 自定义控件与示例集合,涵盖主题切换、MVVM、动画、插件架构、国际化等多个方向的实践示例。
WPFControls/
├── ButtonPlus/ # 自定义按钮样式
├── ColorPicker/ # 颜色选择器
├── ComboBoxPlus/ # 自定义下拉框
├── CustomListView/ # 自定义 ListView 容器
├── DarkMode/ # 明暗主题切换
├── DragWrapListBox/ # 可拖拽的流式列表
├── FadeInFadeOut/ # 淡入淡出动画
├── FloatWindow/ # 悬浮窗口
├── GlobalLanguage/ # 国际化多语言
├── HelperTools/ # 工具库
├── ImageDisplayer/ # 图片展示控件
├── ListSettings/ # 设置历史列表
├── ListViewPlus/ # 带搜索的增强 ListView
├── LoadingControl/ # 加载动画控件
├── MefExample.Core/ # MEF 插件核心接口
├── MefExample.Main/ # MEF 主程序
├── MefExample.PluginOne/ # MEF 插件示例一
├── MefExample.PluginTwo/ # MEF 插件示例二
├── MenuBar/ # 自定义菜单栏
├── MultiPageWrapListBox/ # 分页流式列表
├── MvvmPasswordBox/ # MVVM 密码框
├── PasswordBox/ # 自定义密码框
├── PasswordBoxPlus/ # 带占位符的密码框
├── RadioButtonPlus/ # 图标式单选按钮
├── RountedEventExample/ # 路由事件示例
├── SerializationReplyListBox/ # 可序列化回复列表
├── Settings.Demo/ # 设置面板示例
├── SettingsListView/ # 设置列表
├── Shortcut/ # 键盘快捷键绑定
├── Slider/ # 带刻度的滑块
├── SortableListView/ # 可排序 ListView
├── SqlDemo/ # 数据库操作示例
├── StateChange/ # 视觉状态切换
├── TabControl/ # 自定义选项卡
├── TabControls/ # Dragablz 可拖拽选项卡
├── TextBoxPlus/ # 增强输入框 / 数字输入控件
├── TitleBar/ # 自定义标题栏
├── ToggleButtonPlus/ # 滑动开关按钮
├── TrayApp/ # 系统托盘应用
├── TreeViewPlus/ # 增强树形控件
├── TreeviewPlus/ # 树形控件扩展
└── WrapListBox/ # 流式布局列表
演示如何使用 DynamicResource 在运行时动态切换 Light Mode、Dark Mode 和默认主题,无需重启应用即可生效。
提供多种 Tab 样式(矩形 / 下划线),通过动态资源切换主题外观。
集成 Dragablz 库,支持选项卡的拖拽、浮动和重新排列。
提供多种语义化样式:Success、Pass、Warning、Joy、Danger、Common、Unknown、Default,通过 ResourceDictionary 统一管理。
TCIRadioButton(Title / Content / Icon RadioButton),每个选项支持标题、描述文本和图标,适用于选项卡式导航场景。
呈现为滑动开关(Toggle Switch)样式的 ToggleButton,适合设置页面开/关选项。
包含以下子控件:
- TextBoxWithUnitControl — 带单位后缀的文本框
- LimitedNumberBoxWithUnitControl — 带范围限制和单位的数字输入框
- NumberBoxDropDownControl — 带下拉列表的数字输入框
- NumericUpDownControl — 数字步进器(Numeric UpDown)
- PageTurningControl — 翻页/页码跳转控件
- PasswordBox — 基础自定义密码框(
PasswordBoxPlus类) - PasswordBoxPlus — 带水印/占位符文本的密码框
- MvvmPasswordBox — 支持 MVVM 绑定的密码框,解决 WPF 原生
PasswordBox无法双向绑定的问题
为原生 ComboBox 应用自定义样式,与整体主题保持一致。
ColorSelectorControl,提供可视化颜色拾取界面。
TickSlideControl,支持刻度标记和最大值配置。
支持组合键(如 Ctrl+K)的快捷键注册与可视化状态反馈。
ListPlus 控件,内置搜索/过滤功能,实时筛选列表项。
支持点击列头对数据进行升序/降序排序。
自定义 ListView 扩展的基础容器项目。
使用 WrapPanel 作为 ItemsPanel,列表项自动换行排列。
在 WrapListBox 基础上支持拖拽排序。
MultiPageWrapListBoxControl,在 WrapListBox 基础上添加分页功能。
带有 ReplyListManager 和 NotifyObject 的回复/评论树形列表,支持序列化持久化。
专门用于展示设置项历史记录的列表控件,支持添加和清除操作。
TreePlus 控件,在原生 TreeView 基础上进行功能扩展与样式美化。
基于 WindowChrome 实现的自定义标题栏,包含最小化、最大化、关闭按钮及菜单项,支持完全自定义外观。
圆形透明悬浮窗,具有置顶、无任务栏图标等特性,适合全局快捷工具悬浮展示。
自定义 MenuItem 模板,支持多级下拉菜单和展开/收起动画。
ImageDisplayerControl,提供图片加载与操作(Add/Sub)功能。
演示 WPF 动画中淡入(Fade In)和淡出(Fade Out)效果的实现方式。
使用 VisualStateManager 在 Busy、Free、Normal 等状态间切换,并附带颜色过渡动画。
转圈加载(Loading Spinner)控件,用于异步操作时的等待状态展示。
演示 WPF 路由事件(Routed Events)冒泡机制,通过 Button.Click 在父容器统一处理子按钮事件。
MVVM 模式下的系统托盘(Notification Icon)集成,使用 NotifyIconWrapper 实现托盘图标、气泡提示和右键菜单命令。
演示在 WPF 应用中进行 SQL 数据库操作的基本模式。
应用设置/偏好配置界面的综合示例。
演示基于资源文件(.resx)的运行时语言切换,内置 zh-CN(简体中文)和 en-US(英语)支持。
详见项目内
README了解接入方式。
公共工具方法集合,供其他项目引用。
演示使用 Managed Extensibility Framework (MEF) 构建可扩展插件系统的完整流程:
| 项目 | 职责 |
|---|---|
MefExample.Core |
定义插件接口与公共基类 |
MefExample.Main |
主程序,运行时动态加载并展示插件 |
MefExample.PluginOne |
插件示例一 |
MefExample.PluginTwo |
插件示例二 |
| 项目 | 要求 |
|---|---|
| .NET | 6.0-windows 或更高 |
| IDE | Visual Studio 2022(推荐) |
| OS | Windows 10 / 11 |
-
克隆仓库:
git clone https://github.com/LiuAoran/WPFControls.git
-
用 Visual Studio 打开解决方案:
WPFControls/WPFControls.sln -
在解决方案资源管理器中,右键选择想要运行的子项目,设为「启动项目」,然后按
F5运行。 -
每个子项目均为独立可运行的示例,互不依赖(MEF 示例除外,需同时编译 Core 与 Plugin 项目)。