带有 WPF 托管主机控件的 AX 窗体无法第二次打开
AX form with WPF managedhost control can't be open a second time
我正在尝试使用 WPF 托管主机控件创建 AX 窗体。
表单第一次正常打开,但如果我关闭它并尝试重新打开它,则没有任何反应(没有出现错误消息,它什么都不做)
我是不是漏掉了什么?
这是我的代码:
斧头:
public class FormRun extends ObjectRun
{
SEP_Documentation.Customer documentationControl;
CustTable custTable;
}
public void init()
{
super();
if (element.args().record())
{
custTable = element.args().record();
}
documentationControl = CustomerDocumentation.control();
documentationControl.set_AXLanguage(new xInfo().language());
documentationControl.set_User(curUserId());
documentationControl.set_CustomerId(custTable.AccountNum);
documentationControl.Init();
}
WPF :
public partial class Customer : UserControl
{
public string CustomerId { get; set; }
public string User { get; set; }
public string AXLanguage { get; set; }
public Customer()
{
InitializeComponent();
this.CustomerDocuments.SelectionChanged += (obj, e) => Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => this.CustomerDocuments.UnselectAll()));
}
public void Init()
{
IEnumerable<APICustomerDocumentModel> documents = APIDocumentationRepository.GetCustomerDocuments(CustomerId, User, AXLanguage);
this.CustomerDocuments.ItemsSource = documents;
Thread.CurrentThread.CurrentCulture = new CultureInfo(AXLanguage);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(AXLanguage);
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
}
private void DocumentNameClick(object sender, RoutedEventArgs e)
{
Hyperlink link = (Hyperlink)e.OriginalSource;
Process.Start(link.NavigateUri.AbsoluteUri);
}
}
我发现了问题:
我在我的 AX 表单中添加了这样的 try catch :
try
{
...
}
catch (Exception::CLRError)
{
ex = ClrInterop::getLastException();
if (ex != null)
{
ex = ex.get_InnerException();
if (ex != null)
{
error(ex.ToString());
}
}
}
然后,我已经能够看到问题出在哪里:异常发生在我的 WPF 用户控件中的这一行:
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
我猜想在 AX 中关闭表单时用户控件没有完全关闭,因此当覆盖元数据已经完成时抛出异常。
我正在尝试使用 WPF 托管主机控件创建 AX 窗体。
表单第一次正常打开,但如果我关闭它并尝试重新打开它,则没有任何反应(没有出现错误消息,它什么都不做)
我是不是漏掉了什么?
这是我的代码:
斧头:
public class FormRun extends ObjectRun
{
SEP_Documentation.Customer documentationControl;
CustTable custTable;
}
public void init()
{
super();
if (element.args().record())
{
custTable = element.args().record();
}
documentationControl = CustomerDocumentation.control();
documentationControl.set_AXLanguage(new xInfo().language());
documentationControl.set_User(curUserId());
documentationControl.set_CustomerId(custTable.AccountNum);
documentationControl.Init();
}
WPF :
public partial class Customer : UserControl
{
public string CustomerId { get; set; }
public string User { get; set; }
public string AXLanguage { get; set; }
public Customer()
{
InitializeComponent();
this.CustomerDocuments.SelectionChanged += (obj, e) => Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => this.CustomerDocuments.UnselectAll()));
}
public void Init()
{
IEnumerable<APICustomerDocumentModel> documents = APIDocumentationRepository.GetCustomerDocuments(CustomerId, User, AXLanguage);
this.CustomerDocuments.ItemsSource = documents;
Thread.CurrentThread.CurrentCulture = new CultureInfo(AXLanguage);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(AXLanguage);
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
}
private void DocumentNameClick(object sender, RoutedEventArgs e)
{
Hyperlink link = (Hyperlink)e.OriginalSource;
Process.Start(link.NavigateUri.AbsoluteUri);
}
}
我发现了问题:
我在我的 AX 表单中添加了这样的 try catch :
try
{
...
}
catch (Exception::CLRError)
{
ex = ClrInterop::getLastException();
if (ex != null)
{
ex = ex.get_InnerException();
if (ex != null)
{
error(ex.ToString());
}
}
}
然后,我已经能够看到问题出在哪里:异常发生在我的 WPF 用户控件中的这一行:
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
我猜想在 AX 中关闭表单时用户控件没有完全关闭,因此当覆盖元数据已经完成时抛出异常。