wince窗体转html(基于layui)(三)

static void Make()
{
    	//PDA模拟器共享文件夹 映射的虚拟目录
	string dir = "\\Storage Card";
	//生成的html放置的目录
	string pagesDir = dir + Path.DirectorySeparatorChar+"html";
	if (!Directory.Exists(pagesDir))
	{
		Directory.CreateDirectory(pagesDir);
	}

	//记录日志
	StringBuilder log = new StringBuilder();
	//添加MES.PDA.exe引用,然后加载该程序集
	Assembly asm = typeof(MES.PDA).Assembly;
	//存在失败的窗体,单独生成
	List<string> retry = new List<string>() {
		//"BarcodeScan"
	};
	Type formType = typeof(Form);
	Type[] newArgs = new Type[0];
	int count = 0;
	foreach (Type type in asm.GetTypes().Where(t => formType.IsAssignableFrom(t)))
	{
		string formName = type.Name;
		
		if (retry != null && retry.Count > 0 && !retry.Contains(formName))
		{
			continue;
		}
		
		int step = 1;
		log.AppendFormat("-----{0}-------------\r\n", formName);
		Form form = null;
		try
		{
			form = type.GetConstructor(newArgs).Invoke(null) as Form;
		}
		catch(Exception ex) {
			log.AppendFormat("ERROR:构造窗体{0}失败:{1}\r\n", formName, ex.Message);
			Console.WriteLine("构造窗体{0}失败:{1}", formName, ex.Message);
		}

		if (form == null)
		{
			try
			{
				form = Activator.CreateInstance(type) as Form;
			}
			catch (Exception ex)
			{
				log.AppendFormat("ERROR:创建窗体{0}失败:{1}\r\n", formName, ex.Message);
				Console.WriteLine("创建窗体{0}失败:{1}", formName, ex.Message);
			}
		}

		if (form == null)
		{
			continue;
		}

		try
		{
			++step;//2
			//移除Load事件,否则Show会初始化窗体,访问网络,弹框等
			RemoveFormLoadEvent(type, form, formInfo.Item2);
			//最小化窗体,否则控制台频繁刷新
			form.Size = new Size(1, 1);
			//显示窗体,否则Visible全部是False
			form.Show();
			++step;//3
			StringBuilder page = new StringBuilder();
			//转换XML
			page.AppendFormat("<!--{0}/{1}-->\r\n", TransferXml(formInfo.Item1), TransferXml(form.Text));
			//layui-form
			page.AppendFormat("<div class=\"layui-form\" lay-filter=\"{0}\">\r\n",formName);
			string idPrefix = GetFormPrefix(formName);
			if (idPrefix.Length == 1)
			{
				idPrefix = formName;
			}
			List<VListTable> tables = null;
			GetFormRows(form, out tables).ForEach(r => r.Render(page, idPrefix+"_"));
			page.AppendLine("</div>");
			//form.Close();不关闭,因没有Load,关闭会报错
			++step;//4
			/*
			page.Append("<script>\r\n");
			page.Append("	layui.$(document).on(\"bodyLoaded\",function(){\r\n");
			page.Append("		var $ = layui.jquery,\r\n");
			page.Append("		form = layui.form,\r\n");
			if (tables != null && tables.Count > 0)
			{
				page.Append("		table = layui.table,\r\n");
			}
			page.Append("		global = layui.global,\r\n");
			page.Append("		util = layui.util;\r\n");
			page.Append("		\r\n");
			if (tables != null && tables.Count > 0)
			{
				page.Append(string.Join("", tables.Select(t => string.Format("		window.{0} = table.init('{0}');\r\n", t)).ToArray()));
			}
			page.Append("		form.render();\r\n");
			page.Append("	});\r\n");
			page.Append("</script>");
			*/
			page.Append("<script>\r\n");
			page.Append("    initPage({\r\n");
			page.Append("		load(container,args){\r\n");
			page.Append("		    this.container = container;\r\n");
			page.Append("			this.args = args;\r\n");
			if (tables != null && tables.Count > 0)
			{
				page.Append(string.Join("", tables.Select(t => string.Format("            table.init(\"{0}_{1}\",{{cellMinWidth:{2},height:{3},page:false}});\r\n", idPrefix, t.id, VListTable.COLUMN_MIN_WIDTH, t.height)).ToArray()));
			}
			page.Append("		},\r\n");
			page.Append("		reload(container,args){\r\n");
			page.Append("		},\r\n");
			page.Append("		close(){\r\n");
			if (tables != null && tables.Count > 0)
			{
				page.Append(string.Join("", tables.Select(t => string.Format("            table.destroy(\"{0}_{1}\");\r\n", idPrefix, t.id)).ToArray()));
			}
			page.Append("		}\r\n");
			page.Append("</script>");
			++step;//5
			string pageFileName = pagesDir + Path.DirectorySeparatorChar + formName + ".html";
			if (File.Exists(pageFileName))
			{
				File.Delete(pageFileName);
			}
			++step;//6 偶尔报UnauthorizedAccessException需要在retry里重新执行一次
			using (StreamWriter writer = File.CreateText(pageFileName))
			{
				writer.Write(page.ToString());
			}
			++step;//7
			++count;
			log.AppendFormat("----------{0}:{1},{2}:完成\r\n\r\n", count, formName, formName);
		}
		catch (Exception ex)
		{
			log.AppendFormat("{0}:ERROR:解析窗体{1}失败:{2}\r\n", step, formName, ex.Message);
			Console.WriteLine("{0}:解析窗体{1}失败:{2}", step, formName, ex.Message);
		}
	}

	if (log.Length > 0)
	{
		string logFile = "\\Storage Card\\log.txt";
		File.Delete(logFile);
		using (StreamWriter writer = File.CreateText(logFile))
		{
			writer.Write(log.ToString());
		}
	}
}

//移除Load事件
static void RemoveFormLoadEvent(Type type, Form form, string method)
{
	if (string.IsNullOrEmpty(method))
	{
		return;
	}

	EventInfo loadEvent = type.GetEvent("Load");
	if (loadEvent == null)
	{
		return;
	}
	MethodInfo loadMethod = type.GetMethod(method, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
	if (loadMethod == null)
	{
		return;
	}

	MethodInfo removeMethod = loadEvent.GetRemoveMethod();
	Delegate loadHandler = Delegate.CreateDelegate(loadEvent.EventHandlerType, form, loadMethod);
	removeMethod.Invoke(form, new object[] { loadHandler });
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闪耀星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值