如何在 WPF 中插入/拔出设备时更新串行端口?

巴里图书馆

我想SerialPort在我的 WPF 项目中使用,所以我有一个combobox像这样显示所有可用的端口名:

XAML

<ComboBox x:Name="cb_PortName" ItemsSource="{Binding SerialPortNames}" SelectedValue="{Binding CurrentPortName}" DisplayMemberPath=""/>

ViewModel 中

    public MainViewModel()
    {
        Initialize_SerialPort();
    }

    public void Initialize_SerialPort()
    {
        SerialPortNames = new ObservableCollection<string>();
        foreach(string str in SerialPort.GetPortNames())
        {
            serialPortNames.Add(str);
        }
    }

    private string currentPortName;
    public string CurrentPortName
    {
        get { return currentPortName; }
        set
        {
            if(this.CurrentPort != null)
            {
                if(this.CurrentPort.IsOpen)
                {
                    this.CurrentPort.Close();
                }
            }
            currentPortName = value;
            OnPropertyChanged("CurrentPortName");
            this.CurrentPort = new SerialPort();
        }
    }

    private ObservableCollection<string> serialPortNames;
    public ObservableCollection<string> SerialPortNames
    {
        get { return serialPortNames; }
        set
        {
            serialPortNames = value;
            OnPropertyChanged("SerialPortNames");
        }
    }

    private SerialPort port;
    public SerialPort CurrentPort
    {
        get { return port; }
        set { port = value; }
    }

但通过这种方式,它只在应用程序加载时显示可用的端口名。我想combobox在设备插入/拔出时更新串行端口,那么我应该如何解决这个问题?提前致谢!

拉曼王国

这是你的代码

 public partial class DeviceNotifier : IDisposable
{

    private ManagementEventWatcher w = null;

    public delegate void NotifyUSBRemoved(object sender, EventArgs e);

    public delegate void NotifyUSBAdded(object sender, EventArgs e);

    public event NotifyUSBRemoved _NotifyUsbRemoved;

    public event NotifyUSBAdded _NotifyUsbAdded;

    public void PublishUsbRemoved(object sender)
    {
        if (_NotifyUsbRemoved != null)
        {
            _NotifyUsbRemoved(sender, new EventArgs());
        }
    }

    public void PublishUsbAdded(object sender)
    {
        if (_NotifyUsbAdded != null)
        {
            _NotifyUsbAdded(sender, new EventArgs());
        }
    }


    public void StartRemoveUSBHandler()
    {

        WqlEventQuery eventQuery;
        ManagementScope managementScope = new ManagementScope("root\\CIMV2");
        managementScope.Options.EnablePrivileges = true;

        try
        {

            eventQuery = new WqlEventQuery();
            eventQuery.EventClassName = "__InstanceDeletionEvent";
            eventQuery.WithinInterval = new TimeSpan(0, 0, 3);
            eventQuery.Condition = "TargetInstance ISA 'Win32_USBControllerdevice'";
            w = new ManagementEventWatcher(managementScope, eventQuery);
            w.EventArrived += USBRemoved;

            w.Start();

        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            if (w != null)
            {
                w.Stop();

            }
        }
        finally
        {
            Dispose();
        }


    }

    public void StartInsertUSBHandler()
    {

        WqlEventQuery eventQuery;
        ManagementScope managementScope = new ManagementScope("root\\CIMV2");
        managementScope.Options.EnablePrivileges = true;

        try
        {

            eventQuery = new WqlEventQuery();
            eventQuery.EventClassName = "__InstanceCreationEvent";
            eventQuery.WithinInterval = new TimeSpan(0, 0, 3);
            eventQuery.Condition = "TargetInstance ISA 'Win32_USBControllerdevice'";
            w = new ManagementEventWatcher(managementScope, eventQuery);
            w.EventArrived += USBInserted;
            w.Start();

        }
        catch (Exception e)
        {

            Console.WriteLine(e.Message);
            if (w != null)
            {
                w.Stop();

            }
        }
        finally
        {
            Dispose();
        }

    }


    internal void USBRemoved(object sender, EventArgs e)
    {
        PublishUsbRemoved(sender);
    }


    internal void USBInserted(object sender, EventArgs e)
    {
        PublishUsbAdded(sender);
    }

    #region "Clean up"
    private bool disposed = false;
    public void Dispose()
    {
        CleanUp(true);
        GC.SuppressFinalize(this);
    }

    private void CleanUp(bool disposing)
    {

        if (!this.disposed)
        {

            if (disposing)
            { w.Dispose(); }
            disposed = true;
        }
    }


    ~DeviceNotifier()
    {
        CleanUp(false);
    }
    #endregion
}

并且用法就像在任何开始事件中一样

调用 StartRemoveUSBHandler 和 StartInsertUSBHandler 方法

订阅事件

在你的一段代码中

Private DeviceNotifier notifier  = new DeviceNotifier();  
  public MainViewModel()
    {
        InitializeNotifications();
        Initialize_SerialPort();
   }

 private  void InitializeNotifications()
        {
            notifier.StartInsertUSBHandler();
            notifier._NotifyUsbAdded += Notifier__NotifyUsbAdded;

            notifier.StartRemoveUSBHandler();
            notifier._NotifyUsbRemoved += Notifier__NotifyUsbRemoved;
        }

        private void Notifier__NotifyUsbRemoved(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }

        private void Notifier__NotifyUsbAdded(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章