note:使用强命名语言开发web页面的尝试2--Jimmy
在上一篇文章中我们已经可以使用c#来编写extjs的页面了,总结一下,基本可以得到如下结论:
- 可是使用代码生成工具,生成可以编译的c#代码。
- 通过生成的c#代码,可以实现对Extjs页面的所有操作。包括new 新对象,使用Extjs的事件机制。
- 在c#中可以使用接口,可以使用继承(别笑,这个特性在版本1中是无法使用的)
问题是:
- 我们不能在c#中,创建一个类,这个类继承于Extjs中的某个对象。
尝试是这样的:我直接创建一个类,这个类继承于Extjs中的某一个类。使用时的错误是,这个类没有声明(因为编译器觉得这个c#的类
也是从js中声明过,直接使用就行)
为了解决这个问题,我的解决方法是:
- 使用c#自身的事件机制
- 使用c#对象封装Extjs对象,然后在继承c#对象。
- 更改编译机制
我觉得第二条更靠谱,我们来试验一下,是否可行。
第二条可以运行通过,代码如下:
定义了一个对象
public class ObjectEventTest:JsScript{public Ext.util.Observable e { get; set; }public ObjectEventTest(){this.e = new Observable();var o = new JsScript();o["dosth"] = true;o["done"] = true;this.e.addEvents(o);}public void Todo(){bool @event = this.e.fireEvent("dosth");}}
这是使用方法:
var evt = new ObjectEventTest();evt.e.on("dosth", new Ext.AnonymousDelegate(this.ToDo));evt.e.on("dosth", new Ext.AnonymousDelegate(this.ToDo1));var win = new WindowClass(new WindowConfig(){width = (double) 300,height = (double)300,title = "jj",items = new object[]{new Ext.Button(new ButtonConfig(){text = "触发事件",handler = new Ext.ButtonClickDelegate(delegate(Button button, EventObject o) {evt.Todo();})})}});win.show();
事实证明事件被触发了两次,证明这种方法有效。
昨天使用extjs的事件机制,并进行了整合。今天我们来尝试第一条方案,看看能否试验通过:
代码如下:
public delegate void dosth();
internal class OgnlEventTest
{
public event dosth TestEvent;
public void FireEvent()
{
dosth onTestEvent = TestEvent;
if (onTestEvent != null)
{
onTestEvent();
}
}
}
使用代码如下:
var oevnt = new OgnlEventTest();
oevnt.TestEvent += new dosth(oevnt_TestEvent);
这样的方法也可以使用,不过原生的Delegate没有相应的实现,这里我们参考mono的源代码来实现相应的功能。