群控模式

 如果不考虑在用户勾选群控模式下根据不同的设备使用不同的参数变量的话,在模块的Start方法中使用Device则代表当前设备,也就是每一个设备。

 SDK在调用模块的主代码,也就是执行Start方法之前会将Device变量设置为当前设备。 写在Start方法中的模块代码会在每台设备上依次执行。这个时候定义的全局变量对每台设备来说都是一样的,无法为每台设备设置不同的参数值。

普通群控模块

  1. 创建一个正常模块
  2. 在Start方法中打印出当前的设备名称
public override void Start()
        {
            Device.ScriptEngine.Toast(Device.Name);
        }
  1. 编译该模块,勾选群控并执行,可以看到每台设备上都弹出了提示内容,而且内容都是当前设备的名称。

所以我们可以认为,Start方法内的代码会在每台设备的上执行,而且执行的时候,Device变量的值就是该设备。

不同参数的群控模块

 在特殊情况下,我们希望每台设备在执行模块时,所做的事情是不一样的,比如加不同的好友,导入不同的联系人。这个时候我们需要在模块内定义全局变量。

using System;
using System.IO;
using System.Reflection;
using System.Threading;

namespace Xky.XModule.ContactManager
{
    public class ContactManager : Core.XModule
    {
        public string username = "小明";
        public override string Description()
        {
            return "[支持群控]添加好友";
        }

        public override byte[] Icon()
        {
            Assembly myAssembly = Assembly.GetExecutingAssembly();
            Stream myStream = myAssembly.GetManifestResourceStream("Xky.XModule.ContactManager.icon.png");
             if (myStream != null)
                        {
                            byte[] bytes = new byte[myStream.Length];
                            myStream.Read(bytes, 0, bytes.Length);
                            return bytes;
                        }
                        else
                        {
                            Console.WriteLine("模块图标路径有误,无法加载!");
                            return null;
                        }
        }

        public override bool IsBackground()
        {
            return false;
        }

        public override string Name()
        {
            return "添加好友";
        }
       
        public override bool ShowUserControl()
        {

            return true;
        }
        public override void Start()
        {
            Device.ScriptEngine.Toast(username);

        }
    }
}

  在上面的模块代码中,我们定义了一个全局变量“username”用来为不同的设备设置要加的不同的好友,在Start方法中弹出要加的好友名称模拟加好友方法。

 如果这个时候执行群控执行模块,会发现所有设备添加的都是同一个好友,如果想让每台设备添加不同的好友,我们就需要在模块在每个设备上执行之前修改“username”的值。

 在实际应用过程中,假设我们通过读取文件或其他方式获取到了一个“username”的列表,我们如何分配到每台设备中呢?这里需要修改一下ShowUserControl方法中的代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Threading;

namespace Xky.XModule.ContactManager
{
    public class ContactManager : Core.XModule
    {
        public string username = "小明";
        public override string Description()
        {
            return "[支持群控]添加好友";
        }

        public override byte[] Icon()
        {
            Assembly myAssembly = Assembly.GetExecutingAssembly();
            Stream myStream = myAssembly.GetManifestResourceStream("Xky.XModule.ContactManager.icon.png");
             if (myStream != null)
                        {
                            byte[] bytes = new byte[myStream.Length];
                            myStream.Read(bytes, 0, bytes.Length);
                            return bytes;
                        }
                        else
                        {
                            Console.WriteLine("模块图标路径有误,无法加载!");
                            return null;
                        }
        }

        public override bool IsBackground()
        {
            return false;
        }

        public override string Name()
        {
            return "添加好友";
        }
       
        public override bool ShowUserControl()
        {
            List<string> userlist = new List<string>() { "小明","小红","二狗"};
            //获取到将要在每台设备上执行的模块实例
            List<Core.XModule> modulelist = GetXModules();
            for (int i=0;i<userlist.Count;i++)
            {
                if (modulelist.Count > i)
                {
                    //将模块实例强制转换为当前模块实例
                    ContactManager cm = (ContactManager)modulelist[i];
                    //修改全局变量的值
                    cm.username = userlist[i];
                }
            }
            
             return true;
        }
        public override void Start()
        {
            Device.ScriptEngine.Toast(username);

        }
    }
}

通过GetXModules获取到即将在所有群控设备上执行的模块实例列表,强制转换,修改全局变量的值,就可以实现在不同的设备执行Start方法时使用的是不同的全局变量值。

如果我们需要用面板来更加方便的为每台设备分配不同的参数,可以直接将GetXModules()方法获取到的模块列表传到面板上,通过同样的方法为模块的全局变量赋值。同时还可以调用每个模块实例的Device属性配合WPF强大的控件集合来实现更加完美的用户交互体验。

上次更新: 2019-6-4 10:06:49