Team.Feeder.Controls.Wpf 2.0.0
Team.Feeder.Controls.Wpf
Team.Feeder.Controls.Wpf 是面向 WPF 宿主的控件包,目标不是再造一套设备协议 API,而是把 Team.Feeder 已有的设备对象、状态和命令能力整理成可以直接落到 XAML 中复用的控件、ViewModel、资源字典和主题/多语言基础设施。
适用场景
- 你正在开发 WPF 宿主,希望直接复用现成的 Feeder 控件。
- 你需要状态面板、设备发现界面、数值编辑控件以及主题/本地化支持。
- 你希望 UI 绑定
IFeeder或IFFFeederDevice,而不是自己从协议层开始写界面。
包内提供的主要内容
| 类型/区域 | 作用 |
|---|---|
FFFeederStatusPanel |
绑定单设备状态和实时状态的只读状态面板 |
FFFeederDiscoveryControl |
FFFeeder 扫描与网络参数操作控件 |
NumericUpDown / NumericSliderUpDown |
可复用的数值输入控件 |
ThemeService / ControlThemeAdapter |
Light/Dark 主题切换与控件本地资源同步 |
LocalizationService |
运行时语言切换 |
Resources/Languages |
多语言资源 |
Themes |
颜色令牌、画刷与主题资源字典 |
内置编辑器遵循设备协议范围:料斗两路模拟输出为 0–100%;振动编辑器的数值内容左对齐,
四个电机面板分别提供 0–255 Hz 频率输入;共享频率按设备 RP36 / RP37 的实际范围线性调节,并按当前四路比例缩放电机频率,无效范围回退为 0–255 Hz。频率/时长输入保留 + / - 精调按钮;系统设置的越界输入会恢复为编辑前的设备实际值且不会下发。
MotionPad 与振动编辑器共享动作选择时,仅由编辑器加载一次动作参数;MotionPad 直接触发动作,避免重复读取。
两者还可通过 IsLayoutRotated 共享 0°/180° 布局状态,使四个电机面板与方向盘位置标识始终一一对应。
安装
dotnet add package Team.Feeder.Controls.Wpf
安装本包时会自动拉取它的 Team.Feeder 依赖包;WPF 宿主自身仍需要是 net472 或 net8.0-windows 等支持 WPF 的目标框架。
宿主最小接线
先在 App.xaml 合并主题入口字典:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Team.Feeder.Controls.Wpf;component/Themes/Theme.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
然后在页面里引用控件:
<Window x:Class="Demo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:Team.Feeder.Controls.Wpf.Controls;assembly=Team.Feeder.Controls.Wpf">
<Grid>
<controls:FFFeederStatusPanel Feeder="{Binding CurrentFeeder}" />
</Grid>
</Window>
这里的 CurrentFeeder 通常是实现了 IFeeder 的运行时设备,例如 FFFeeder。
状态面板怎么绑定
FFFeederStatusPanel 的核心输入是 IFeeder:
- 它会读取
Descriptor和Status。 - 如果该设备同时实现
IFFFeederDevice,它还会订阅LiveState,展示平台/料斗/序列/背光等高频状态。
因此最常见的用法是直接把 FFFeeder 实例绑定过去,而不是再包一层复杂 DTO。
发现控件怎么接入
FFFeederDiscoveryControl 默认就能工作:
- 未显式注入服务时,会回落到内置
FFFeederUdpDiscoveryService。 - “设置 IP”和“重置”默认可直接执行。
- 如果宿主需要二次确认、审计或权限校验,可以通过 ViewModel 上的委托做前置拦截。
典型接法:
var viewModel = new FFFeederDiscoveryViewModel();
viewModel.AuthorizeResetAsync = async item =>
{
return await ConfirmAsync($"确认重置 {item.MacAddress} ?");
};
DiscoveryControl.DataContext = viewModel;
运行时切换语言
LocalizationService.Instance.ChangeCulture("en");
LocalizationService.Instance.ChangeCulture("zh-CN");
切换后:
LocalizeDictionary.CultureLang.Culture- 当前线程文化
都会同步更新。依赖本地化字符串的 ViewModel 也会通过 CultureChanged 事件刷新绑定值。
运行时切换主题
ThemeService.Instance.ChangeTheme(AppTheme.Dark);
ThemeService.Instance.ChangeTheme(AppTheme.Light);
主题切换要求在 UI 线程执行。控件内部的本地资源会通过 ControlThemeAdapter 跟随宿主主题变化。
与其他包的关系
- 控件绑定的设备对象通常来自
Team.Feeder.FFFeeder。 - 多设备列表和批量操作通常来自
Team.Feeder.Service。 - 如果宿主还要持久化注册表和恢复设备,一般再接
Team.Feeder.Host。 - 发现控件内部默认使用
Team.Feeder.Discovery。
边界说明
- 这里不直接实现 TCP/UDP 协议。
- 这里不维护宿主注册表。
- 这里不在控件内部偷偷创建宿主级设备集合。
这个包的职责是“把已有能力变成可复用 WPF 界面”,而不是把业务后端塞进控件层。
No packages depend on Team.Feeder.Controls.Wpf.
.NET Framework 4.7.2
- Team.Feeder.Abstractions (>= 2.0.0)
- Team.Feeder.Discovery (>= 2.0.0)
- Team.Feeder.FFFeeder (>= 2.0.0)
- Team.Feeder.Service (>= 2.0.0)
- CommunityToolkit.Mvvm (>= 8.3.2)
- SharpVectors.Reloaded (>= 1.8.5)
- WPFLocalizeExtension (>= 3.10.0)
.NET 8.0
- Team.Feeder.Abstractions (>= 2.0.0)
- Team.Feeder.Discovery (>= 2.0.0)
- Team.Feeder.FFFeeder (>= 2.0.0)
- Team.Feeder.Service (>= 2.0.0)
- CommunityToolkit.Mvvm (>= 8.3.2)
- SharpVectors.Reloaded (>= 1.8.5)
- WPFLocalizeExtension (>= 3.10.0)
| Version | Downloads | Last updated |
|---|---|---|
| 2.0.2 | 8 | 09/19/2026 |
| 2.0.1 | 6 | 09/14/2026 |
| 2.0.0 | 7 | 09/02/2026 |
| 2.0.0-alpha2 | 6 | 09/02/2026 |