我正在使用多个Windows窗体和多个Element宿主对象开发Excel加载项以包含WPF控件。我还有一个调用Web服务的表单。并将结果显示回Excel。
我目前面临的问题是当前:在与插件进行一些交互后(没有找到特定的顺序),我的插件停止正常运行,在PresentationFramework.dll中的某处抛出了无效的操作异常。我无法检查在那里运行的代码,因为它已被隐藏。
Exception说明如下:"应用程序对象正在关闭"。
导致这种情况的原因是什么?
在用于某些自定义绘图的控件的初始化时抛出它
InitializeComponent();
堆栈跟踪如下所示:
在System.Windows.Application.GetResourcePackage(Uri packageUri)\ r \ n,位于System.Windows.Application.GetResourceOrContentPart(Uri uri)\ r \ n,位于System.Windows.Application.LoadComponent(对象组件,Uri resourceLocator) \ r \ n在d:\ Projects \ Common \ Depict \ Drawing \ MoleculeView.xaml中的Drawing.MoleculeView.InitializeComponent()中:在D:\ Projects \ Common中的Drawing.MoleculeView..ctor()中的第1行\ r \ n \描述\ Drawing \ MoleculeView.xaml.cs:第192行\ r \ n在DrawingControlWrapper.MultipleDrawingControl.LoadMolecule(分子分子,Point []界限)c:\ Users \ Nikolay \ Desktop \ Addin \ DrawingControlWrapper \ MultipleDrawingControl.xaml。 cs:第32行\ r \ n在CallSite.Target(Closure,CallSite,MultipleDrawingControl,Object,Point [])\ r \ n在LMCExcelFunctions.ThisAddIn.QueueMolecule(Object mol)中的c:\ Users \ Nikolay \ Desktop \ Addin \ LMCExcelFunctions \ ThisAddIn.cs:第182行\ r \ n在CallSite.Target(Closure,CallSite,Type,Object)\ r \ n在LMCExcelFunctions.ThisAddIn.addin_SheetSelectionChange(Obj) ect sh,Range target)在c:\ Users \ Nikolay \ Desktop \ Addin \ LMCExcelFunctions \ ThisAddIn.cs:第93行
XAML看起来像这样:
<UserControl x:Class="Drawing.MoleculeView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<DockPanel x:Name="layout" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
</DockPanel>
</UserControl>
答案 0 :(得分:15)
如果你设置了Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown,你的问题就会消失。
答案 1 :(得分:1)
WPF控件需要一个应用程序实例,但是winForm不会实例化WPF应用程序。 您可以在应用程序启动时通过以下代码来解决该问题:
System.Windows.Application app = new System.Windows.Application()
{
ShutdownMode = Windows.ShutdownMode.OnExplicitShutdown
};
Closed += () =>
{
app.Shutdown();
};
或在Vb.net中:
Dim app As System.Windows.Application = New System.Windows.Application With {
.ShutdownMode = Windows.ShutdownMode.OnExplicitShutdown
AddHandler Closed, Sub()
app.Shutdown()
End Sub
答案 2 :(得分:0)
使用内部元素主机解决:看起来由托管在元素主机内的控件创建的任何控件也必须具有自己的元素主机。