我想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] 删除。
我来说两句