note:使用强命名语言开发web页面的尝试2--Jimmy

上一篇文章中我们已经可以使用c#来编写extjs的页面了,总结一下,基本可以得到如下结论:
  1. 可是使用代码生成工具,生成可以编译的c#代码。
  2. 通过生成的c#代码,可以实现对Extjs页面的所有操作。包括new 新对象,使用Extjs的事件机制。
  3. 在c#中可以使用接口,可以使用继承(别笑,这个特性在版本1中是无法使用的)
问题是:
  1. 我们不能在c#中,创建一个类,这个类继承于Extjs中的某个对象。
尝试是这样的:我直接创建一个类,这个类继承于Extjs中的某一个类。使用时的错误是,这个类没有声明(因为编译器觉得这个c#的类
也是从js中声明过,直接使用就行)
 
为了解决这个问题,我的解决方法是:
  1. 使用c#自身的事件机制
  2. 使用c#对象封装Extjs对象,然后在继承c#对象。
  3. 更改编译机制
我觉得第二条更靠谱,我们来试验一下,是否可行。
第二条可以运行通过,代码如下:
定义了一个对象
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的源代码来实现相应的功能。
 
posted on 2012-03-24 22:48  Jimmy_June  阅读(196)  评论(0编辑  收藏  举报