use*_*ser 4 vb.net wpf excel add-in
我有一个 Excel 加载项,上面有一个按钮,可以在新线程上调用 WPF 应用程序。当我在没有打开 WPF 应用程序或打开它然后再次关闭它之后关闭 Excel 时,Excel 会立即关闭,但是,每当我打开应用程序然后关闭 Excel 时,Excel 需要 5-10 秒才能关闭。我只遇到过这些解决方案,但都没有帮助:
我正在运行 VS 2010 和 Excel 2010,所以不应该有互操作性问题。
有人有建议吗?
线程代码:
Private qbdThread As Thread = Nothing
Private frmQBD As QBDApplication.MainWindow
qbdThread = New Thread(New ParameterizedThreadStart(AddressOf RunQBD))
qbdThread.SetApartmentState(Threading.ApartmentState.STA)
qbdThread.Start(TabletType)
AddHandler QBDApplication.MainWindow.QBDClose, AddressOf QBDThreadClose
Private Sub RunQBD(Optional tabletQBDSelected As String = Nothing)
...
frmQBD = New QBDApplication.MainWindow(contacts, saveLocation, tabletQBDLocal)
frmQBD.Show()
frmQBD.Activate()
System.Windows.Threading.Dispatcher.Run()
End Sub
Run Code Online (Sandbox Code Playgroud)
此代码在用户在新线程上关闭应用程序时运行:
Me.Close()
System.Windows.Threading.Dispatcher.CurrentDispatcher.InvokeShutdown()
Run Code Online (Sandbox Code Playgroud)
然后使用以下代码在主线程 (ThisAddin.vb) 上引发一个事件:
Private Sub QBDThreadClose()
qbdThread = Nothing
frmQBD = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)
要注意的另一件事是,当 frmQBD 不是作为类变量创建,而是在“RunQBD”子中进行标注时,不会发生此问题。这将解决我的问题,但随后我将无法在主线程上访问类似 frmQBD.Activate() 的内容,而我需要这样做。
编辑:代码已更新
我们找到了解决此问题的方法。
你必须在框架中设置一个AppSwith
Public Sub EnablePointerSupport()
AppContext.SetSwitch("Switch.System.Windows.Input.Stylus.EnablePointerSupport",True)
End Sub
Run Code Online (Sandbox Code Playgroud)