因为WinCC平台的特殊性,为WinCC或者其它组态软件开发.Net控件有一些地方需要特别注意。如果我们不能对平台特性有所了解,在控件开发过程中难免会走弯路。我们团队长期致力于WinCC平台上的.Net控件开发,在多年的控件开发过程中,碰到了不少问题。今天和大家分享一个比较典型的问题。
我们的.Net控件在加载时有时需要根据属性值进行初始化,比如控件的背景色,多语言或者其它一些功能等。如果这些属性在WinCC中是通过静态值传递那么没有任何问题。如果是通过WinCC的变量动态传递那么就会发现控件无法进行初始化。因为控件在加载时获取不到变量值而导致的初始化失败。这是为何呢?
图1 控件属性传递静态或者动态值

因为在.Net中,我们的控件属性一般采用简化的书写方式。
public int MyProperty { get; set; }public int MyProperty1 { get; set; }public int MyProperty2 { get; set; }private void LineView_Load(object sender, EventArgs e) { if (MyProperty == 0) { // } }
上面的代码中,初始化代码放在了控件的Load事件中。这种写法对于静态值传递是没有问题的。但是如果传递的是动态值那么就会初始化失败。这是因为在.Net控件加载时,变量的当前值还没有被刷新。可能当控件的Load事件执行完成后变量值才更新。所以导致控件的初始化失败。对于这种问题,我们需要采用完整的自定义属性语法。
private int _MyProperty = 0;public int MyProperty { get { return _MyProperty; } set { _MyProperty = value; InitialControl(); } }public int MyProperty1 { get; set; }public int MyProperty2 { get; set; }private void InitialControl() { // // }
在上面的代码中,当属性值更新时调用单独的方法进行初始化,这样就可以避免.Net控件在WinCC画面中的初始化失败问题了。