MoldOutboundExecutePage.xaml.cs 2.8 KB
using IndustrialControl.ViewModels;
using IndustrialControl.Services;   // ✅ 引入扫描服务

namespace IndustrialControl.Pages;

[QueryProperty(nameof(OrderNo), "orderNo")]
public partial class MoldOutboundExecutePage : ContentPage
{
    public string? OrderNo { get; set; }  // Shell QueryProperty 接收

    private readonly MoldOutboundExecuteViewModel _vm;
    private readonly ScanService _scanSvc;  // ✅ 扫描服务

    public MoldOutboundExecutePage(MoldOutboundExecuteViewModel vm, ScanService scanSvc)
    {
        InitializeComponent();
        BindingContext = _vm = vm;
        _scanSvc = scanSvc;

        // 与项目里其它页保持一致的扫码配置
        _scanSvc.Prefix = null;
        _scanSvc.Suffix = null;
        _scanSvc.DebounceMs = 0;
    }

    protected override async void OnNavigatedTo(NavigatedToEventArgs args)
    {
        base.OnNavigatedTo(args);
        if (!string.IsNullOrWhiteSpace(OrderNo))
        {
            await _vm.LoadAsync(OrderNo);   // 维持你现有逻辑
        }
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
        // ✅ 注册扫描回调并开始监听
        _scanSvc.Scanned += OnScanned;
        _scanSvc.StartListening();

        // ✅ 让“模具编码”输入框也能接收键盘/扫描枪字符
        _scanSvc.Attach(MoldEntry);
        MoldEntry.Focus();
    }

    protected override void OnDisappearing()
    {
        // ✅ 页面离开时及时注销,避免多个页面抢占扫码
        _scanSvc.Scanned -= OnScanned;
        _scanSvc.StopListening();
        base.OnDisappearing();
    }

    // ✅ 硬件/广播 扫到码
    private void OnScanned(string data, string type)
    {
        MainThread.BeginInvokeOnMainThread(async () =>
        {
            // 1) 回填到输入框(UI 可见)
            MoldEntry.Text = data;

            // 2) 如需联动业务:在此调用 VM 方法(按需实现)
            //    例如:await _vm.HandleMoldScannedAsync(data, type);

            // 3) 如果只是想用扫描即“勾选相应行”,可在这里根据编码查找并置 Selected=true
            //    ⚠ 你的行模型 MoldOutboundDetailRow 目前不是可通知对象,直接赋值 UI 不一定刷新;
            //    建议后续把它改成 ObservableObject 再做切换高亮。
        });
    }

    // ✅ 手动输入并按回车,也走同一套逻辑
    private async void OnMoldCompleted(object? sender, EventArgs e)
    {
        var code = MoldEntry.Text?.Trim();
        if (string.IsNullOrEmpty(code)) return;

        // 可选:与 OnScanned 同步的处理
        // await _vm.HandleMoldScannedAsync(code, "manual");

        // 光标回到输入框,便于连续扫描
        MoldEntry.CursorPosition = MoldEntry.Text?.Length ?? 0;
        MoldEntry.Focus();
    }
}