我最近为我的其他项目制作了一个类库(dll)来通过串口(COM)对蓝牙设备进行编程。该库用于通过COM端口传输固件。它的工作正常,直到需求到来,这需要一个WPF窗口来显示编程的进度。我已使用标准WPF应用程序模板成功创建了进度条。但是,标准WPF不允许我生成dll。在这里搜索之后,我发现这个link教你如何将WPF窗口添加到现有的类库项目中。此外,有人教你如何从here显示窗口。在我尝试之前,一切看起来都很好,当我从LabVIEW中调用方法namespace BTMProg
{
public class BTMProgrammer
{
private bool _uut1Status = false;
private string _uut1Message = "";
public bool UUT1Status
{
get { return _uut1Status; }
set { _uut1Status = value; }
}
public string UUT1Message
{
get { return _uut1Message; }
set { _uut1Message = value; }
}
public void ProgramBluetooth (string ioPort, string firmwareFile)
{
List<UUT> uutList = new List<UUT>();
uutList.Add(new UUT(ioPort, "UUT1", 1));
Thread thread = new Thread(() =>
{
var wn = new MainWindow(uutList, firmwareFile);
wn.ShowDialog();
wn.Closed += (s, e) => wn.Dispatcher.InvokeShutdown();
Dispatcher.Run();
if (wn.TaskList[0].Result.ToUpper().Contains("SUCCESS"))
{
_uut1Status = true;
_uut1Message = wn.TaskList[0].Result;
}
else
{
_uut1Status = false;
_uut1Message = wn.TaskList[0].Result;
}
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
}
}
时,没有任何东西出现。
我的主要方法,在一个单独的.cs文件中:
ProgrammingViewModel _pvm = new ProgrammingViewModel();
private List<string> _viewModeList = new List<string>();
private List<Task<string>> _taskList = new List<Task<string>>();
public List<Task<string>> TaskList {
get => _taskList;
set => _taskList = value;
}
public MainWindow(List<UUT> uutList, string firmwareFile)
{
InitializeComponent();
foreach (var uut in uutList)
{
_viewModeList.Add(uut.UutName);
}
_pvm.AddProcessViewModels(_viewModeList);
ProgressBarView.DataContext = _pvm.ProcessModels;
StartProgramming(uutList, firmwareFile);
Application.Current.MainWindow.Close();
}
我在MainWindow.xaml.cs中的WPF代码:
5xx
之前的问题是,如果我不使用调度程序来创建一个新线程,那么一个例外是&#34;调用线程必须是STA,因为许多UI组件需要这个......&#34 ;抛出。使用新线程后,没有错误,但窗口没有按预期显示。可能是什么问题呢?感谢。
答案 0 :(得分:0)
ShowDialog
函数将停止执行线程,直到窗口关闭,这意味着该代码的其余部分可能无法运行,并且调度程序可能无法启动。您应该尝试使用Show
方法,该方法会在显示窗口后立即返回。
此外,在窗口的构造函数中这些行发生了什么?
StartProgramming(uutList, firmwareFile);
Application.Current.MainWindow.Close();
无论第一行是什么,它都需要返回,如果你想让窗口完成构建,它就不需要做很多工作。第二行毫无意义。你为什么要关闭应用程序的主窗口?你有没有在某个时候设置并打开一个与该属性相关的窗口?
我怀疑这些事情中的一个或多个阻止线程到达可以显示窗口的位置。