带有WPF受管理主机控件的AX表单无法再次打开

时间:2019-05-17 15:26:26

标签: c# wpf x++

我正在尝试使用WPF托管主机控件创建AX表单。

第一次正常打开该表单,但是如果我关闭它并尝试重新打开它,则什么也没有发生(没有错误消息出现,它什么也不做)

我想念什么吗?

这是我的代码:

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);
        }
    }

1 个答案:

答案 0 :(得分:1)

我发现了问题:

我在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中关闭表单时用户控件没有完全关闭,所以当覆盖元数据已经完成时会引发异常。