在AX2012的form中可以使用.net的控件,这些控件包括windows form控件(System.Windows.Forms命名空间)、Windows presentation foundation的控件(System.Windows.Controls命名空间)以及从这些空间派生出来的类型或者UserControl类型。这些.net控件由AX的ManagedHost控件宿主,在添加一个.net控件到form时,一个ManagedHost也被添加。
添加.net控件到form可以是在设计时添加,也可以在运行时动态添加,无论哪种方式都需要添加相应程序集的引用。在AOT的References节点下右键菜单中“Add reference”可以选择要引用的程序集,也可以在AOT中form上new managedcontrol是选择添加引用程序集并选择相应的控件。这些程序集必须是强签名的,managedhost纪录程序集的名称、版本号语言及public token,由这些信息来唯一标识一个.net的程序集。
下面简单演示如何动态的添加一个Windows form的button控件到AX form上:
public void init() { FormManagedHostControl managedHostControl; System.Windows.Controls.Button myButton; System.Exception laste; ; super(); try { managedHostControl = this.design().addControl(FormControlType::ManagedHost, "ManagedButton"); managedHostControl.assemblyName("PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"); managedHostControl.typeName("System.Windows.Controls.Button"); managedHostControl.sizing(Sizing::SizeToContent); myButton = managedHostControl.control(); myButton.set_ToolTip("Press button to view the current time"); myButton.set_Content("Time"); myButton.UpdateLayout(); myButton.add_Click(new ManagedEventHandler(this, "MyButton_Click")); } catch (Exception::CLRError) { laste = CLRInterop::getLastException(); throw error(laste.ToString()); } } public void MyButton_Click(System.Object sender, System.EventArgs args) { ; Box::info("The current time: " + time2Str(timeNow(), TimeSeparator::Colon, TimeFormat::AMPM), "Current Time"); }
运行的截图如下:
在form的init函数中创建一个managedHost控件,指定其程序集、控件的类型,再从managedHost.control()得到对button控件的引用,就可以使用set_xxxx、get_xxxx等方法来操作.net控件的属性了。.net控件可以响应事件,使用add_xxxx放了来添加事件句柄,form的方法不能直接添加为句柄函数,必须使用ManagedEventHandler来封装。总的来看用法比较简单,却给我们在AX中创建复杂的UI提供了方便。