如何从类库(DLL)项目中显示WPF窗口?

时间:2018-04-04 23:43:58

标签: c# wpf dll

我最近为我的其他项目制作了一个类库(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 ;抛出。使用新线程后,没有错误,但窗口没有按预期显示。可能是什么问题呢?感谢。

1 个答案:

答案 0 :(得分:0)

ShowDialog函数将停止执行线程,直到窗口关闭,这意味着该代码的其余部分可能无法运行,并且调度程序可能无法启动。您应该尝试使用Show方法,该方法会在显示窗口后立即返回。

此外,在窗口的构造函数中这些行发生了什么?

StartProgramming(uutList, firmwareFile);
Application.Current.MainWindow.Close();

无论第一行是什么,它都需要返回,如果你想让窗口完成构建,它就不需要做很多工作。第二行毫无意义。你为什么要关闭应用程序的主窗口?你有没有在某个时候设置并打开一个与该属性相关的窗口?

我怀疑这些事情中的一个或多个阻止线程到达可以显示窗口的位置。