Team.Feeder.Controls.Wpf 2.0.0-alpha2

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.Culture
  • Lang.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

.NET 8.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