星空客户端自定义控件开发入门(仅支持到WPF的GUI客户端)
【应用场景】
1、应用背景:在企业应用中广泛存在一些接入设备,如电子行业的激光扫描设备,IC卡刷卡设备,医疗行业的电子秤,射频读卡器,影像设备等。接口类型没有同一标准,有的采用RS232,RS485,USB等,有的采用FTP文件服务器,有的采用Smart Card接口组件,驱动设备也各行其是。K/3 Cloud作为一个通用平台,不能包罗所有的第三方接入驱动。因此,我们开放一个桌面端的接口模型,实现这些设备的二次开发接入。
2、开发技术要求:基于DotNet FrameWork 4.0的WPF编程技术,基于C#编程语言,有C/S编程基础概念,有VistualStudio工具使用经验。
自定义组件开发
1、在Visual Studio 2012中新增类库工程;如果需要新增有WPF界面元素的,必须新建WPF类库类型的工程。(注意,如果使用的控件是32位平台的,那么客制化组件工程文件指定目标平台为x86)
(vs2012新建工程界面选择红框中的项目类型)
(vs2012新建工程界面选择红框中的项目类型)
2、引用客户端安装目录下【Kingdee\K3Cloud\DeskClient\K3CloudClient\controlplugins】基础组件;
3、新建类,编写自定义控件桌面客户端代码如下:
public partial class UserControl1 : UserControl, IKDCustomControl, IDynamicFormSupported
{
public UserControl1()
{
InitializeComponent();
}
public IKDCustomControlProxy Proxy { get; set ; }
public IKDDynamicFormProxy FormProxy { get; set; }
///初始化逻辑代码写在这里
public void InitComponent()
{
}
///些方法提供给服务端插件调用
public void SelectItem(string index)
{
int selectIn;
bool result = int.TryParse(index, out selectIn);
if (result)
{
ComSelect.SelectedIndex = selectIn;
}
}
///这里进行资源释放
public void Release()
{
}
///自定义控件调用FireCustomEvent方法将数据发发送到后台服务,服务端插件重写CustomEvent方法并获取数据
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Proxy.FireCustomEvent(new CustomEventArgs("", "Success", "{message:'WriteString() Success!'}"));
}
}
这个类对应xaml文件代码:
<UserControl x:Class="WpfCustomControlLibrary1.UserControl1"
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"
xmlns:local="clr-namespace:WpfCustomControlLibrary1"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Orientation="Horizontal">
<ComboBox x:Name="ComSelect" VerticalAlignment="Center" HorizontalAlignment="Center" Width="200">
<ComboBoxItem>COM1</ComboBoxItem>
<ComboBoxItem>COM2</ComboBoxItem>
<ComboBoxItem>COM3</ComboBoxItem>
<ComboBoxItem>COM4</ComboBoxItem>
</ComboBox>
<Button Content="SendData" Height="40" Width="80" Margin="20 0 0 0" Click="Button_Click"/>
</StackPanel>
</Grid>
</UserControl>
自定义控件效果:
(自定义控件设计时效果)
(自定义控件放到单据中的效果)
4.编译工程
自定义控件开发完成后编译项目,并将生成的dll文件压缩成.zip格式压缩文件,然后将*.zip文件改名成*.dll.kdz文件
5.将自定义控件部署到应用服务器
将第4步生成的*.dll.kdz文件拷贝到【WebSite/ClientBin/CustomControl/WPF】目录下,并且改这个目录下的2个文件MainDownload.xml和MainDownloadList.xml每次更新后将2个文件中的version信息修改保存,以便客户端及时更新到组件,需要中MainDownloadList.xml文件FileList节点中添加一个KDDownloadItem节点内容如下图:
6.打开想要使用自定义控件的单据在单据上拖放一个自定义控件,然后设置好控件的程序集名和命名空间名(就是我们自定义控件工程的程序集名和命名空间名称),如下图:
7.注册表单插件,并且在插件中编写代码获取自定义控件数据以及调用自定义控件中的方法
8.插件代码可以采用C#语言写也可以采用Python语言,本示例采用Python脚本实现简单交互如需实现复杂功能建议使用C#语言编写插件,Python插件代码如下:
from System import*
from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import *
def ButtonClick(e):
if(e.Key.upper()=="FSENDDATATOCUSTOMCTRL"):
str1 = "2";
args =[str1];
#实现自定义控件的接口调用
this.View.GetControl("FCUSTOMCONTROL").InvokeControlMethod( "DoCustomMethod", "SelectItem", args);
#特别注意:这里的args参数应对是一个对象数组,在C#中如下编码;
#0个参数的情况: var args = new object[1]; args[0] = null;
#1个参数的情况: var args = new object[1]; args[0] = str1;
#2个参数的情况: var args = new object[2]; args[0] = str1; args[1] = str2;
#n个参数的情况: var args = new object[n]; args[0] = str1; args[1] = str2; ... args[n-1] = strn;
#这里获取自定义控件发送到服务端的数据
def CustomEvents(e):
# if(e.Key==" FCUSTOMCONTROL "):
this.View.GetControl("F_abc_LargeText_83g").SetCustomPropertyValue("Value", e.EventArgs);
this.View.GetControl("FTextTest").SetCustomPropertyValue("Value", e.EventArgs);
this.View.ShowMessage(e.EventArgs);
【参考资料】
【二开案例.基础资料.联动查询(GetValue)】
https://vip.kingdee.com/article/8751?productLineId=1&isKnowledge=2&lang=zh-CN
星空客户端自定义控件开发入门(仅支持到WPF的GUI客户端)
本文2024-09-23 04:26:12发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-165288.html