posts - 1175, comments - 146, trackbacks - 1, articles - 5
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2012年2月7日

新服务器发布网站时,遇到如下情况:

只有HTML能正常访问,其他诸如WebService,WCF等都不能访问,显示:Server Application Unavailable 的错误。

进入“事件查看器”,写明:没有权限访问System.Web。

但是我已经将Windows的文件夹的权限的用户设为了与访问该网站的用户的权限一致。

另外网上所传的新建应用程序池也不行。

最后,我的解决办法是:应用程序池的属性-》标识-》预定义账户-》改为“本地系统”,遇到安全提示不用去理他。

 

posted @ 2012-02-07 23:17 linFen 阅读(18) 评论(0) 编辑

2012年2月1日

第一:新建一个类(Class)

Win32Native.cs

代码如下:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace WpfApplication1 

    public class Win32Native 
    { 
        [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetParent")] 
        public extern static IntPtr SetParent(IntPtr childPtr, IntPtr parentPtr);  
    } 
}

第二:新建两个窗体:

Window1.xaml

Window2.xaml

第三:Window1.xaml.cs中添加引用

using System.Windows.Interop;

第四:在Window1窗体中放上一个Button1

其事件如下:


private void button1_Click(object sender, RoutedEventArgs e) 

    Window2 w2 = new Window2(); 
    w2.Show();   

    WindowInteropHelper parentHelper = new WindowInteropHelper(this); 
    WindowInteropHelper childHelper = new WindowInteropHelper(w2);  

    Win32Native.SetParent(childHelper.Handle, parentHelper.Handle); 

    testMdiWindow.WindowState = WindowState.Maximized;//加上这句可实现窗口加载时最大化,注意语句位置
}

 WinForms实现方法较简单一些,

private void button1_Click(object sender, RoutedEventArgs e)
{
    Window2 w2 = new Window2();
    w2.MdiParent = this;
    w2.Show();


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dotkit/archive/2009/11/11/4799055.aspx

 

posted @ 2012-02-01 21:43 linFen 阅读(29) 评论(0) 编辑

2011年12月6日

  在开始之前,先熟悉几个类及部分属性、方法:CSharpCodeProviderICodeCompilerCompilerParametersCompilerResultsAssembly

  一、CSharpCodeProvider
    提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码,可以使用VBCodeProvider

    CreateCompiler():获取编译器的实例。

  二、ICodeCompiler
    定义用于调用源代码编译的接口或使用指定编译器的CodeDOM树。每种编译方法都接受指示编译器的CompilerParameters对象,并返回指示编译结果的CompilerResults对象。

    CompilerAssemblyFromSource(CompilerParameters option, string source):使用指定的编译器,从包含源代码的字符串设置编译程序集。

  三、CompilerParameters
    
表示用于调用编译器的参数。

    ReferencedAssemblies:获取当前项目所引用的程序集。Add方法为程序集添加引用。
    GenerateExecutable:获取或设置一个值,该值指示是否生成可执行文件。若此属性为false,则生成DLL,默认是false。
    GenerateInMemory:获取或设置一个值,该值指示是否在内存中生成输出。

  四、CompilerResults
    表示从编译器返回的编译结果。

    CompiledAssembly:获取或设置以编译的程序集,Assembly类型。

  五、Assembly
    就是程序集了(不知道如何描述了)。

  大致了解了以上知识之后,就可以使用C#动态的编译并执行代码了,一下是一段示例程序:

using System;
using System.Reflection;
using System.Globalization;
using Microsoft.CSharp;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Text;

namespace ConsoleApplication1
{
    
publicclass Program
      {
        
staticvoid Main(string[] args)
          {
            
// 1.CSharpCodePrivoder
              CSharpCodeProvider objCSharpCodePrivoder =new CSharpCodeProvider();

            
// 2.ICodeComplier
              ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();

            
// 3.CompilerParameters
              CompilerParameters objCompilerParameters =new CompilerParameters();
              objCompilerParameters.ReferencedAssemblies.Add(
"System.dll");
              objCompilerParameters.GenerateExecutable
=false;
              objCompilerParameters.GenerateInMemory
=true;

            
// 4.CompilerResults
              CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode());

            
if (cr.Errors.HasErrors)
              {
                  Console.WriteLine(
"编译错误:");
                
foreach (CompilerError err in cr.Errors)
                  {
                      Console.WriteLine(err.ErrorText);
                  }
              }
            
else
              {
                
// 通过反射,调用HelloWorld的实例
                  Assembly objAssembly = cr.CompiledAssembly;
                
object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
                  MethodInfo objMI
= objHelloWorld.GetType().GetMethod("OutPut");

                  Console.WriteLine(objMI.Invoke(objHelloWorld,
null));
              }

              Console.ReadLine();
          }

        
staticstring GenerateCode()
          {
              StringBuilder sb
=new StringBuilder();
              sb.Append(
"using System;");
              sb.Append(Environment.NewLine);
              sb.Append(
"namespace DynamicCodeGenerate");
              sb.Append(Environment.NewLine);
              sb.Append(
"{");
              sb.Append(Environment.NewLine);
              sb.Append(
"      public class HelloWorld");
              sb.Append(Environment.NewLine);
              sb.Append(
"      {");
              sb.Append(Environment.NewLine);
              sb.Append(
"          public string OutPut()");
              sb.Append(Environment.NewLine);
              sb.Append(
"          {");
              sb.Append(Environment.NewLine);
              sb.Append(
"               return \"Hello world!\";");
              sb.Append(Environment.NewLine);
              sb.Append(
"          }");
              sb.Append(Environment.NewLine);
              sb.Append(
"      }");
              sb.Append(Environment.NewLine);
              sb.Append(
"}");

            
string code = sb.ToString();
              Console.WriteLine(code);
              Console.WriteLine();

            
return code;
          }
      }
}

posted @ 2011-12-06 09:51 linFen 阅读(112) 评论(0) 编辑

2011年11月24日

应用的可扩展性、可维护性和灵活性取决于应用架构的质量。不幸的是,这往往被视为马后炮。概念设计和原型变成了大规模的应用,许多应用的基础基本就是示例代码的复制与粘贴,这很诱人,因为这可以让你在项目在开始阶段有一个快速的进度。 然而,节省下来的时间相对于项目后期的维护、扩展甚至重构应用的时间来说,算不得什么。比较好的的方式是写一个可靠的架构,在实施前编写好遵循的约定和定义应用的视图、模型、存储和控制器等。在这篇文章,我们将会看到一个受欢迎的应用并讨论如何构建用户接口,从而创建可靠的架构。
代码结构
应用程序架构体系会为实际类和框架大妈提供结构和一致性。建立一个好的架构有以下主要好处:
■ 每个应用的工作方式是相同的,因而你只需要学习一次。
■ 在应用之间很容易分享代码,因为工作方式是相同的。
■ 你可以使用ExtJS的生成工具为你的应用程序创建经过优化的发布版本。
在ExtJS 4创建你的应用时,应该考虑一下我们定义的约定,尤其是统一的目录结构。这个结构要求所有类文件都放到app目录下,在该目录下,可根据命名空间划建立models、views、controllers和stores等4个子目录。

虽然ExtJS 4提供了如何构建你的应用的最佳做法,但是你也可以根据自己需要修改我们建议的文件和类的命名约定,例如,你可以为你的控制器在“Controller”前加上前缀,如“Users”修改为“UsersController”。在这种情形下,记得给所有的控制器文件和类加前缀。最重要的一点是,要在开始编写应用程序前定义好这些约定并遵守它。这样,你就可以在任何需要的地方调用这些类。我们强烈建议要遵守控制器、模型、Store、视图这4个文件夹的命名约定,这可以确保你可以使用SDK Tools beta对应用进行优化。
寻找平衡点
视图
将应用程序的UI分割成视图是好的开始。通常做法是,你提供线框,而设计师创建UI实体模型。尝试一下使用以下模型,让我们的设计师如何使用ExtJS重建(非常有吸引力)Pandora应用。

我们需要在视图粒度与通用性之间寻求一个平衡。让我们看看当划分太多视图的时候会发生什么。

将UI划分成太多小的视图将会让视图在控制器中变得难以管理、引用和控制。另外,由于每个视图都有其自己的文件,创建过多的视图会让定义UI块或视图逻辑时很难找到视图文件。
另一方面,我们不希望视图变得太通用,因为这样在修改时会失去灵活性。

在这种情况下,每个视图已经过于简化。当视图的几个部件需要自定义视图逻辑的时候,视图类最终会有太多的负担,产生的视图类变得很难维护。另外,当设计师考虑改变UI时,我们不得不重构视图定义和视图逻辑,这是相当烦人的事。
当我们可以轻松的在页面上重新排列视图,热切不需要每次都重构它们的时候,说明已经取得了平衡。例如,我们可以把广告作为独立视图,这样,我就可以很容器移动它,甚至删除它。

在这一版本,我们根据视图的任务来划分UI。一旦你对使用视图组合UI有整体思路,那么,你就可以在实现它们时对其粒度作出调整。有时候,你会觉得两个视图应该成为一个,或是视图太通用,需要将其划分成多个视图,这是一个良好的开端的基础。我相信我们已经做到了这一点。
模型
现在我们已经有了视图的基本结构,是时候考虑模型的问题了。通过考察UI中动态数据的类型,我们可以获得应用中所需的不同模型。

我们已经决定只使用两个模型:Song和Station。我们可以定义多两个模型:Artist和Album。然而,与视图类似,我们并不想定义模型时也变得太通用。在当前情况下,我们并不需要将artist和album信息独立出来,因为当前应用不允许用户根据指定的artist选择song。相反,数据是根据station组织的,song是重点,而artist和album是song的属性。这意味着我们不能将song、artist和album结合到一个模型。这可以大大简化应用的数据边界。这也能简化在服务器端的API,因而我们不需要加载artists和albums。因而,对于这个示例,只需要2个模型:Song和Station。
Stores
现在我们需要考虑如何在应用中使用模型,也就是如何设计Store的问题。

要搞清楚需要使用那些Store是比较容易的。一个好的策略是先确定页面上所有需要绑定数据的组件。在当前情况下,我们需要列出用户收喜爱stations,一个显示近期播放过的歌曲的scroller,一个搜索区域以显示搜索结果。每一个这样的视图度需要绑定一个Store。
控制器
有几种方法可以让你通过应用控制器发布应用的响应。让我们开始考虑当前例子需要那些控制器。

这里有2个基本控制器:SongController和StationController。ExtJS 4允许你使用一个控制同时其控制几个视图。StationController要处理的事情包括创建新的stations,以及当用户喜爱的station加载后,将其应用到StationList视图。SongController负责管理SongInfo视图和根据用户的liking、disliking、暂停和跳过操作更新RecentSong Store。控制器可通过应用事件的触发和监听实现相互之间的交互。当我们可以创建余下的控制器,一个用于管理playback,另外一个用于搜索stations,我想我们已经找到了好的划分响应的方法。
三思而后行
我们分享我们的想法,重点在于希望有助于你写代码前的应用架构的规划。我们期望通过应用程序的细节讨论有助于你建立更灵活的更容易维护架构。

posted @ 2011-11-24 20:44 linFen 阅读(278) 评论(0) 编辑

2011年11月9日

一、树面板简单示例

Javascript代码 复制代码 收藏代码
  1. var tree = Ext.create('Ext.tree.Panel', {   
  2.     title: '树面板简单示例',   
  3.     width : 150,   
  4.     height : 100,   
  5.     renderTo: Ext.getBody(),   
  6.     root: {   
  7.         text: '树根',//节点名称   
  8.         expanded: true,//默认展开根节点   
  9.         children: [{   
  10.             text: '节点一',//节点名称   
  11.             leaf: true//true说明为叶子节点   
  12.         }, {   
  13.             text: '节点二',//节点名称   
  14.             leaf: true//true说明为叶子节点   
  15.         }]   
  16.     }   
  17. });  
var tree = Ext.create('Ext.tree.Panel', {
	title: '树面板简单示例',
	width : 150,
	height : 100,
	renderTo: Ext.getBody(),
	root: {
	    text: '树根',//节点名称
	    expanded: true,//默认展开根节点
	    children: [{
	        text: '节点一',//节点名称
	        leaf: true//true说明为叶子节点
	    }, {
	        text: '节点二',//节点名称
	        leaf: true//true说明为叶子节点
	    }]
	}
});



二、多列树示例

Javascript代码 复制代码 收藏代码
  1. var tree = Ext.create('Ext.tree.Panel', {   
  2.     title: 'TreeGrid(多列树示例)',   
  3.     renderTo: Ext.getBody(),   
  4.     width : 200,   
  5.     height : 120,   
  6.     fields: ['name''description'],   
  7.     columns: [{   
  8.         xtype: 'treecolumn',//树状表格列   
  9.         text: '名称',   
  10.         dataIndex: 'name',   
  11.         width: 100,   
  12.         sortable: true  
  13.     }, {   
  14.         text: '描述',   
  15.         dataIndex: 'description',   
  16.         flex: 1,   
  17.         sortable: true  
  18.     }],   
  19.     root: {   
  20.         name: '树根',   
  21.         description: '树根的描述',   
  22.         expanded: true,   
  23.         children: [{   
  24.             name: '节点一',   
  25.             description: '节点一的描述',   
  26.             leaf: true  
  27.         }, {   
  28.             name: '节点二',   
  29.             description: '节点二的描述',   
  30.             leaf: true  
  31.         }]   
  32.     }   
  33. });  
var tree = Ext.create('Ext.tree.Panel', {
    title: 'TreeGrid(多列树示例)',
    renderTo: Ext.getBody(),
    width : 200,
    height : 120,
    fields: ['name', 'description'],
    columns: [{
        xtype: 'treecolumn',//树状表格列
        text: '名称',
        dataIndex: 'name',
        width: 100,
        sortable: true
    }, {
        text: '描述',
        dataIndex: 'description',
        flex: 1,
        sortable: true
    }],
    root: {
        name: '树根',
        description: '树根的描述',
        expanded: true,
        children: [{
            name: '节点一',
            description: '节点一的描述',
            leaf: true
        }, {
            name: '节点二',
            description: '节点二的描述',
            leaf: true
        }]
    }
});



三、树面板中的复选框示例

Javascript代码 复制代码 收藏代码
  1. var tree = Ext.create('Ext.tree.Panel', {   
  2.     title: '复选框示例',   
  3.     width : 150,   
  4.     height : 100,   
  5.     renderTo: Ext.getBody(),   
  6.     root: {   
  7.         text: '树根',//节点名称   
  8.         expanded: true,//默认展开根节点   
  9.         children: [{   
  10.             text: '节点一',//节点名称   
  11.             checked : true,//默认选中   
  12.             leaf: true//true说明为叶子节点   
  13.         }, {   
  14.             text: '节点二',//节点名称   
  15.             checked : false,//默认不选中   
  16.             leaf: true//true说明为叶子节点   
  17.         }]   
  18.     }   
  19. });  

posted @ 2011-11-09 23:30 linFen 阅读(387) 评论(0) 编辑

摘要: 一、grid的例: Javascript代码 //配置表格列 {header:"姓名",width:50,dataIndex:'name'}, {header:"组长",width:50,dataIndex:'leader', xtype:'booleancolumn',//Ext.grid.column.Boolean布尔列 trueText:'是', falseText:'否'}, {header:"生日",width:100,dataIndex:&#阅读全文

posted @ 2011-11-09 23:29 linFen 阅读(550) 评论(0) 编辑

摘要: 1、创建Ext.data.Model数据实体模型 Javascript代码 //注册用户数据模型User Ext.regModel('User',{ fields:[//定义模型字段 {name:'name',type:'string'}, {name:'age',type:'int'}, {name:'phone',type:'string'} ] }); //创建User模型的实体对象 varuser=Ext.ModelMgr.create({ name:'tom'阅读全文

posted @ 2011-11-09 23:27 linFen 阅读(337) 评论(0) 编辑

摘要: 1、append方法 Javascript代码 vartpl=newExt.Template(//定义模板 '<tableborder=1cellpadding=0cellspacing=0>', '<tr><tdwidth=90>姓名</td><tdwidth=90>{0}</td></tr>', '<tr><td>年龄</td><td>{1}</td></tr>', '<tr阅读全文

posted @ 2011-11-09 23:25 linFen 阅读(225) 评论(0) 编辑

一、addListener方法

Javascript代码 复制代码 收藏代码
  1. var button = Ext.get('btn');   
  2. button.addListener('click',hello1);//绑定事件处理函数   
  3. button.addListener('click',hello2);  
var button = Ext.get('btn');
button.addListener('click',hello1);//绑定事件处理函数
button.addListener('click',hello2);



二、ExtJS支持的自定义事件

Javascript代码 复制代码 收藏代码
  1. //创建Person类   
  2. var Person = Ext.extend(Ext.util.Observable,{   
  3.     constructor : function(name){   
  4.        this.name = name;   
  5.        this.sayNum = 0;   
  6.        this.say = function(){   
  7.             if(this.sayNum < 2){   
  8.                 this.sayNum += 1;   
  9.                 alert('I am '+name);   
  10.             }else{   
  11.                 this.sayNum = 0;//触发自定义事件后计数器归零   
  12.                 this.fireEvent('onSay',this);//激发自定义事件   
  13.             }   
  14.        }   
  15.        this.addEvents({//加入自定义事件   
  16.           "onSay" : true  
  17.        });   
  18.     }   
  19. });   
  20. var per = new Person('tom',3);//创建对象   
  21. //为自定义事件绑定处理函数   
  22. per.addListener('onSay',function handler(){   
  23.     alert('发生了自定义事件');   
  24. });  
//创建Person类
var Person = Ext.extend(Ext.util.Observable,{
	constructor : function(name){
	   this.name = name;
	   this.sayNum = 0;
	   this.say = function(){
			if(this.sayNum < 2){
				this.sayNum += 1;
				alert('I am '+name);
			}else{
				this.sayNum = 0;//触发自定义事件后计数器归零
				this.fireEvent('onSay',this);//激发自定义事件
			}
	   }
	   this.addEvents({//加入自定义事件
		  "onSay" : true
	   });
	}
});
var per = new Person('tom',3);//创建对象
//为自定义事件绑定处理函数
per.addListener('onSay',function handler(){
	alert('发生了自定义事件');
});
Html代码 复制代码 收藏代码
  1. <input type='button' value='say' onclick='per.say()'>  
<input type='button' value='say' onclick='per.say()'>


自定义事件的另外一个例子:

Javascript代码 复制代码 收藏代码
  1. //继承自Ext.util.Observable   
  2. var Person = Ext.extend(Ext.util.Observable,{   
  3.     constructor : function(name){   
  4.        this.name = name;   
  5.        this.say = function(){   
  6.             this.fireEvent('onSay',this.name);//激发自定义事件   
  7.        }   
  8.        this.addEvents({//加入自定义事件   
  9.           "onSay" : true  
  10.        });   
  11.     }   
  12. });   
  13. var per = new Person('tom');//创建对象   
  14.   
  15. //为自定义事件绑定处理函数   
  16. per.addListener('onSay',function(name){   
  17.     alert("I'am " + name);   
  18. });  
//继承自Ext.util.Observable
var Person = Ext.extend(Ext.util.Observable,{
	constructor : function(name){
	   this.name = name;
	   this.say = function(){
			this.fireEvent('onSay',this.name);//激发自定义事件
	   }
	   this.addEvents({//加入自定义事件
		  "onSay" : true
	   });
	}
});
var per = new Person('tom');//创建对象

//为自定义事件绑定处理函数
per.addListener('onSay',function(name){
	alert("I'am " + name);
});


拦截器使用示例Observable.capture,与上面例子不同的地方是“var per = new Person('tom');//创建对象”代码之后的内容替换为:

Javascript代码 复制代码 收藏代码
  1. per.addListener('onSay',handler);//为自定义事件绑定处理函数   
  2. function handler(){//事件处理函数   
  3.     alert('发生了自定义事件');   
  4. }   
  5. //为per对象添加拦截器   
  6. Ext.util.Observable.capture(per,captureFunction);   
  7. //拦截函数   
  8. function captureFunction(eventName){   
  9.     if(eventName == 'onSay'){//事件名称是onSay则返回false终止事件的执行   
  10.         alert("拦截事件:“"+eventName+"”。");   
  11.         return false;   
  12.     }   
  13.     return true;   
  14. }  
per.addListener('onSay',handler);//为自定义事件绑定处理函数
function handler(){//事件处理函数
	alert('发生了自定义事件');
}
//为per对象添加拦截器
Ext.util.Observable.capture(per,captureFunction);
//拦截函数
function captureFunction(eventName){
	if(eventName == 'onSay'){//事件名称是onSay则返回false终止事件的执行
		alert("拦截事件:“"+eventName+"”。");
		return false;
	}
	return true;
}



三、addManagedListener受管事件监听器:

Javascript代码 复制代码 收藏代码
  1. function createFn(){   
  2.     alert('新建');   
  3. }   
  4. function openFn(){   
  5.     alert('打开');   
  6. }   
  7. function saveFn(){   
  8.     alert('保存');   
  9. }   
  10. Ext.create('Ext.toolbar.Toolbar',{//创建工具栏   
  11.     renderTo: Ext.getBody(),   
  12.     bodyPadding: 5,   
  13.     width:300,   
  14.     items : [   
  15.         {text:'新建',id:'createBtn',iconCls:'newIcon'},   
  16.         {text:'打开',id:'openBtn',iconCls:'openIcon'},   
  17.         {text:'保存',id:'saveBtn',iconCls:'saveIcon'},   
  18.         {text:'销毁新建按钮',handler : function(){   
  19.             //销毁新建按钮   
  20.             Ext.getCmp('createBtn').destroy();   
  21.         }}   
  22.     ]   
  23. });   
  24. var createBtn = Ext.getCmp('createBtn');   
  25. createBtn.on('click',createFn);   
  26. //以下的事件绑定将受createBtn组件是否销毁的控制,如果createBtn组件销毁   
  27. //了则事件绑定同时解除。   
  28. createBtn.addManagedListener(Ext.getCmp('openBtn'),'click',openFn);   
  29. createBtn.addManagedListener(Ext.getCmp('saveBtn'),'click',saveFn);  
function createFn(){
	alert('新建');
}
function openFn(){
	alert('打开');
}
function saveFn(){
	alert('保存');
}
Ext.create('Ext.toolbar.Toolbar',{//创建工具栏
	renderTo: Ext.getBody(),
	bodyPadding: 5,
	width:300,
	items : [
	    {text:'新建',id:'createBtn',iconCls:'newIcon'},
		{text:'打开',id:'openBtn',iconCls:'openIcon'},
		{text:'保存',id:'saveBtn',iconCls:'saveIcon'},
		{text:'销毁新建按钮',handler : function(){
			//销毁新建按钮
			Ext.getCmp('createBtn').destroy();
		}}
	]
});
var createBtn = Ext.getCmp('createBtn');
createBtn.on('click',createFn);
//以下的事件绑定将受createBtn组件是否销毁的控制,如果createBtn组件销毁
//了则事件绑定同时解除。
createBtn.addManagedListener(Ext.getCmp('openBtn'),'click',openFn);
createBtn.addManagedListener(Ext.getCmp('saveBtn'),'click',saveFn);



四、relayEvents传播分发事件:

Javascript代码 复制代码 收藏代码
  1. //创建Employee工人类   
  2. var Employee = Ext.extend(Ext.util.Observable,{   
  3.     constructor : function(config){   
  4.        this.name = config.name;   
  5.        this.eat = function(){   
  6.             this.fireEvent('startEat',this);//激发开始吃饭事件   
  7.             this.fireEvent('finishEat',this);//激发结束吃饭事件   
  8.        }   
  9.        this.addEvents({//加入自定义事件   
  10.           "startEat" : true,//开始吃饭事件   
  11.           "finishEat" : true//结束吃饭事件   
  12.        });   
  13.        Employee.superclass.constructor.call(this, config)   
  14.     }   
  15. });   
  16.   
  17. //定义Waiter服务员类   
  18. var Waiter = Ext.extend(Ext.util.Observable,{   
  19.     constructor : function(config){   
  20.         Waiter.superclass.constructor.call(this, config);   
  21.     }   
  22. });   
  23. //创建员工对象   
  24. var emp = new Employee({name:'tom'});   
  25. //为自定义事件绑定处理函数   
  26. emp.addListener('startEat',function(){   
  27.     alert(this.name + '开始吃饭了。');   
  28. });   
  29. emp.addListener('finishEat',function (){   
  30.     alert(this.name + '吃完饭,可以收拾盘子了。');   
  31. });   
  32. //创建服务员对象   
  33. var waiter = new Waiter();   
  34. //使服务员对象与员工对象的finishEat事件进行关联   
  35. //也就是说当员工对象的finishEat事件发生后,先执行自身的事件监听器,   
  36. //然后事件会传递到服务员对象中,激发服务员对象的finishEat事件。   
  37. waiter.relayEvents(emp, ['finishEat']);   
  38. waiter.on('finishEat',function(){   
  39.     alert('服务员开始收拾盘子。');   
  40. });  
//创建Employee工人类
var Employee = Ext.extend(Ext.util.Observable,{
	constructor : function(config){
	   this.name = config.name;
	   this.eat = function(){
			this.fireEvent('startEat',this);//激发开始吃饭事件
			this.fireEvent('finishEat',this);//激发结束吃饭事件
	   }
	   this.addEvents({//加入自定义事件
		  "startEat" : true,//开始吃饭事件
		  "finishEat" : true//结束吃饭事件
	   });
	   Employee.superclass.constructor.call(this, config)
	}
});

//定义Waiter服务员类
var Waiter = Ext.extend(Ext.util.Observable,{
	constructor : function(config){
		Waiter.superclass.constructor.call(this, config);
	}
});
//创建员工对象
var emp = new Employee({name:'tom'});
//为自定义事件绑定处理函数
emp.addListener('startEat',function(){
	alert(this.name + '开始吃饭了。');
});
emp.addListener('finishEat',function (){
	alert(this.name + '吃完饭,可以收拾盘子了。');
});
//创建服务员对象
var waiter = new Waiter();
//使服务员对象与员工对象的finishEat事件进行关联
//也就是说当员工对象的finishEat事件发生后,先执行自身的事件监听器,
//然后事件会传递到服务员对象中,激发服务员对象的finishEat事件。
waiter.relayEvents(emp, ['finishEat']);
waiter.on('finishEat',function(){
	alert('服务员开始收拾盘子。');
});
Html代码 复制代码 收藏代码
  1. <input type='button' value='员工吃饭' onclick='emp.eat()'>  
<input type='button' value='员工吃饭' onclick='emp.eat()'>



五、Ext.EventObject示例

Javascript代码 复制代码 收藏代码
  1. var btn = Ext.get('buttonTest');   
  2. btn.addListener('click',handler);//为click事件绑定处理函数   
  3. function handler(e){//事件处理函数   
  4.     //获取事件发生时的x坐标   
  5.     var x = e.getPageX();   
  6.     //获取事件发生时的y坐标   
  7.     var y = e.getPageY();   
  8.     var msg = '事件发生坐标 : x='+x+' y='+y;   
  9.     alert(Ext.EventManager.getPageXY(e));   
  10.     alert(msg);   
  11. }  
var btn = Ext.get('buttonTest');
btn.addListener('click',handler);//为click事件绑定处理函数
function handler(e){//事件处理函数
	//获取事件发生时的x坐标
	var x = e.getPageX();
	//获取事件发生时的y坐标
	var y = e.getPageY();
	var msg = '事件发生坐标 : x='+x+' y='+y;
	alert(Ext.EventManager.getPageXY(e));
	alert(msg);
}



六、Ext.EventManager使用

Javascript代码 复制代码 收藏代码
  1. Ext.EventManager.addListener('btn','click',handler);//绑定处理函数  

posted @ 2011-11-09 23:22 linFen 阅读(255) 评论(0) 编辑

摘要: 1、获取页面上的HTML元素,并进行处理,使用Ext.get('elid')方法,参数为HTML元素的id值,由此可对获取到的元素进行各种处理。例如: Javascript代码 varel=Ext.get("the-id"); varappendEl=Ext.get("the-id-append"); functionfn1(){ Ext.Msg.alert("提示","您在id为'the_id'的Element上按下了ctrl+c键"); } el.addCls("spe阅读全文

posted @ 2011-11-09 23:20 linFen 阅读(326) 评论(0) 编辑

  1. <HTML>  
  2.  <HEAD>  
  3.   <TITLE>远程数据源的组合框示例</TITLE>  
  4.   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  5.   <link rel="stylesheet" type="text/css" href="extjs4/resources/css/ext-all.css" />  
  6.   <script type="text/javascript" src="extjs4/bootstrap.js"></script>  
  7.   <script type="text/javascript" src="extjs4/ext-lang-zh_CN.js"></script>  
  8.   <script type="text/javascript">  
  9.     Ext.onReady(function(){   
  10.         //创建数据模型   
  11.         Ext.regModel('BookInfo', {   
  12.             fields: [{name: 'bookName'}]   
  13.         });   
  14.         //定义组合框中显示的数据源   
  15.         var bookStore = Ext.create('Ext.data.Store',{   
  16.             model : 'BookInfo',   
  17.             proxy: {   
  18.                 type: 'ajax',//Ext.data.AjaxProxy   
  19.                 url : 'bookSearchServer.jsp',   
  20.                 reader: new Ext.data.ArrayReader({model : 'BookInfo'})   
  21.             }   
  22.         });   
  23.         //创建表单   
  24.         Ext.create('Ext.form.Panel',{   
  25.             title:'Ext.form.field.ComboBox远程数据源示例',   
  26.             frame : true,   
  27.             height:100,   
  28.             width:270,   
  29.             renderTo: Ext.getBody(),   
  30.             bodyPadding: 5,   
  31.             defaults:{//统一设置表单字段默认属性   
  32.                 labelSeparator :':',//分隔符   
  33.                 labelWidth : 70,//标签宽度   
  34.                 width : 200,//字段宽度   
  35.                 labelAlign : 'left'//标签对齐方式   
  36.             },   
  37.             items:[{   
  38.                 xtype : 'combo',   
  39.                 fieldLabel:'书籍列表',   
  40.                 listConfig : {   
  41.                     loadingText : '正在加载书籍信息',//加载数据时显示的提示信息   
  42.                     emptyText : '未找到匹配值',//当值不在列表是的提示信息   
  43.                     maxHeight : 100//设置下拉列表的最大高度为60像素   
  44.                 },   
  45.                 allQuery:'allbook',//查询全部信息的查询字符串   
  46.                 minChars : 3,//下拉列表框自动选择前用户需要输入的最小字符数量   
  47.                 queryDelay : 300,//查询延迟时间   
  48.                 queryParam : 'searchbook',//查询的名字   
  49.                 triggerAction: 'all',//单击触发按钮显示全部数据   
  50.                 store : bookStore,//设置数据源   
  51.                 displayField:'bookName',//定义要显示的字段   
  52.                 valueField:'bookName',//定义值字段   
  53.                 queryMode: 'remote'//远程模式   
  54.             }]   
  55.         });   
  56.     });   
  57.   </script>  
  58.  </HEAD>  
  59.  <BODY STYLE="margin: 10px">  
  60.  </BODY>  
  61. </HTML>  
<HTML>
 <HEAD>
  <TITLE>远程数据源的组合框示例</TITLE>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <link rel="stylesheet" type="text/css" href="extjs4/resources/css/ext-all.css" />
  <script type="text/javascript" src="extjs4/bootstrap.js"></script>
  <script type="text/javascript" src="extjs4/ext-lang-zh_CN.js"></script>
  <script type="text/javascript">
	Ext.onReady(function(){
		//创建数据模型
		Ext.regModel('BookInfo', {
		    fields: [{name: 'bookName'}]
		});
		//定义组合框中显示的数据源
		var bookStore = Ext.create('Ext.data.Store',{
			model : 'BookInfo',
			proxy: {
		        type: 'ajax',//Ext.data.AjaxProxy
		        url : 'bookSearchServer.jsp',
		        reader: new Ext.data.ArrayReader({model : 'BookInfo'})
		    }
		});
		//创建表单
		Ext.create('Ext.form.Panel',{
			title:'Ext.form.field.ComboBox远程数据源示例',
			frame : true,
			height:100,
			width:270,
			renderTo: Ext.getBody(),
			bodyPadding: 5,
			defaults:{//统一设置表单字段默认属性
				labelSeparator :':',//分隔符
				labelWidth : 70,//标签宽度
				width : 200,//字段宽度
				labelAlign : 'left'//标签对齐方式
			},
			items:[{
				xtype : 'combo',
				fieldLabel:'书籍列表',
				listConfig : {
					loadingText : '正在加载书籍信息',//加载数据时显示的提示信息
					emptyText : '未找到匹配值',//当值不在列表是的提示信息
					maxHeight : 100//设置下拉列表的最大高度为60像素
				},
				allQuery:'allbook',//查询全部信息的查询字符串
				minChars : 3,//下拉列表框自动选择前用户需要输入的最小字符数量
				queryDelay : 300,//查询延迟时间
				queryParam : 'searchbook',//查询的名字
				triggerAction: 'all',//单击触发按钮显示全部数据
				store : bookStore,//设置数据源
				displayField:'bookName',//定义要显示的字段
				valueField:'bookName',//定义值字段
				queryMode: 'remote'//远程模式
			}]
		});
	});
  </script>
 </HEAD>
 <BODY STYLE="margin: 10px">
 </BODY>
</HTML>


JSP代码:

Jsp代码 复制代码 收藏代码
  1. <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>   
  2. <%   
  3. String bookName = request.getParameter("searchbook");   
  4. String jav = "['java编程思想'],['java入门'],['javascript程序设计']";   
  5. String cpp = "['c++编程思想'],['c++入门'],['c++程序设计']";   
  6. String php = "['php程序设计'],['php入门'],['php从入门到精通']";   
  7. String books = "";   
  8. if(bookName.equals("allbook")){   
  9.     books = "["+jav+","+cpp+","+php+"]";   
  10.     response.getWriter().write(books);   
  11.     return;   
  12. }else{   
  13.     bookName = bookName.substring(0,3);//取查询字符串的前3个字符   
  14.     System.out.println(bookName);   
  15.   
  16.     if(bookName.equals("jav")){   
  17.         books = "["+jav+"]";   
  18.     }else if(bookName.equals("c++")){   
  19.         books = "["+cpp+"]";   
  20.     }else if(bookName.equals("php")){   
  21.         books = "["+php+"]";   
  22.     }else{   
  23.         books = "[['没有数据']]";   
  24.     }   
  25.     response.getWriter().write(books);   
  26. }   
  27. %>  

posted @ 2011-11-09 23:16 linFen 阅读(278) 评论(0) 编辑

摘要: Html代码 <HTML><HEAD><TITLE>提示信息</TITLE><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"><linkrel="stylesheet"type="text/css"href="http://www.cnblogs.com/ext-4.0/resources/css/ext-all.css"/><scriptt阅读全文

posted @ 2011-11-09 23:15 linFen 阅读(562) 评论(0) 编辑

摘要: 一、基础知识 1、JAON对象的例子 Javascript代码 <scripttype="text/javascript"> varperson={//json对象定义开始 name:'tom',//字符串 age:24,//数字 sex:'man', married:false,//布尔值 books:[//数组,在数组中又嵌入了两个json对象 {name:'历史',price:30}, {name:'文学',price:25} ] }//json对象定义结束 //通过点号表示法来取得JSON对阅读全文

posted @ 2011-11-09 23:12 linFen 阅读(426) 评论(0) 编辑

摘要: Ext.create('Ext.panel.Panel',{ title:'面板头部(header)', tbar:['顶端工具栏(toptoolbars)'], bbar:['底端工具栏(bottomtoolbars)'], height:200, collapsible:true, collapseDirection:'left', width:300, frame:true, renderTo:Ext.getBody(), bodyPadding:5, bodyStyle:'background-co阅读全文

posted @ 2011-11-09 22:22 linFen 阅读(244) 评论(0) 编辑

2011年11月8日

摘要: 首先先上一个Ext布局类型的继承图:Ext.layout.ContainerLayoutExt.layout.AnchorLayoutExt.layout.AbsoluteLayoutExt.layout.FormLayoutExt.layout.BorderLayoutExt.layout.ColumnLayoutExt.layout.FitLayoutExt.layout.AccordionExt.layout.CardLayout Ext.layout.TableLayout 再上一个Ext.Container及其子类继承图:Ext.Container Ext.Viewport Ext.阅读全文

posted @ 2011-11-08 22:44 linFen 阅读(65) 评论(0) 编辑

摘要: 目标:介绍Panel布局的各种类 Panel布局类在VS中的介绍内容:Panel布局类有10种:容器布局,自适应布局,折叠布局,卡片式布局,锚点布局,绝对位置布局,表单布局,列布局,表格布局,边框布局 1,Ext.layout.ContainerLayout 容器布局 提供容器作为布局的基础逻辑,通常会被扩展而不通过new关键字直接创建,一般作为默认布局存在 2,Ext.layout.FitLayout 自适应布局使用layout:'fit' 将使面板子元素自动充满容器,如果有多个子面板也只会第一个会被显示 3,Ext.layout.AccordionLayout 折叠布局 (阅读全文

posted @ 2011-11-08 22:38 linFen 阅读(285) 评论(0) 编辑

2011年11月4日

摘要: //验证输入为数字 02private void txt_time_KeyDown(object sender, KeyEventArgs e) 03{ 04if (!((e.Key >= Key.D0 && e.Key <= Key.D9) || (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9))) 05{ 06e.Handled = true; 07} 08} 0910//屏蔽粘贴非法字符 11private void txt_time_TextChanged(object sender, 阅读全文

posted @ 2011-11-04 14:12 linFen 阅读(50) 评论(0) 编辑

2011年10月25日

摘要: 如果有时间加了很多overlayItem,由于缩放问题 有些不能显示为了全部显示Java代码 publicvoidcenterOverlays(){ intminLat=81*MapStoresController.MAP_SCALE; intmaxLat=-81*MapStoresController.MAP_SCALE; intminLon=181*MapStoresController.MAP_SCALE; intmaxLon=-181*MapStoresController.MAP_SCALE; for(inti=0;i<overlayItems.size();i++){ Sto阅读全文

posted @ 2011-10-25 05:38 linFen 阅读(36) 评论(0) 编辑

摘要: 类 OverlayItem java.lang.Object∟ com.baidu.mapapi.OverlayItempublic class OverlayItemextends java.lang.ObjectItemizedOverlay的基本组件。字段摘要 类型名称static intITEM_STATE_FOCUSED_MASKbitset位: 标识该overlay item处于焦点选中状态static intITEM_STATE_NORMAL_MASKbitset位:表明该overlay item处于正常状态static intITEM_STATE_PRESSED_MASKbit阅读全文

posted @ 2011-10-25 05:09 linFen 阅读(199) 评论(0) 编辑

2011年9月20日

摘要: 现在总结一下android的selector的用法。首先android的selector是在drawable/xxx.xml中配置的。先看一下listview中的状态:把下面的XML文件保存成你自己命名的.xml文件(比如list_item_bg.xml),在系统使用时根据ListView中的列表项的状态来使用相应的背景图片。drawable/list_item_bg.xml复制到剪贴板XML/HTML代码<?xmlversion="1.0"encoding="utf-8"?><selectorxmlns:android="h阅读全文

posted @ 2011-09-20 22:38 linFen 阅读(410) 评论(0) 编辑

2011年9月14日

摘要: 代码如下:1、自定义DialogpublicclassSelectDialogextendsAlertDialog{publicSelectDialog(Contextcontext,inttheme){super(context,theme);}publicSelectDialog(Contextcontext){super(context);}@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.slt_cnt_t阅读全文

posted @ 2011-09-14 21:35 linFen 阅读(2558) 评论(1) 编辑

2011年9月9日

摘要: 说明android:id 为控件指定相应的IDandroid:text指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串android:gravity指定View组件的对齐方式,比如说居中,居右等位置 这里指的是控件中的文本位置并不是控件本身android:layout_gravity 指定Container组件的对齐方式.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为 例,android:layout_gravity="right"则button靠右a阅读全文

posted @ 2011-09-09 21:33 linFen 阅读(219) 评论(0) 编辑

2011年8月26日

摘要: 这个示例演示了GridSplitter控件的使用。GridSplitter派生于Thumb,只能使用于Grid中,而且要指定它所在的row和column位置(以及行和列的span):GridSplitter split = new GridSplitter();split.Width = 6;grid.Children.Add(split);Grid.SetColumn(split, 2);Grid.SetRow(split, 1);GridSplitter可以和其它元素共享相同的单元格,这就存在谁遮挡了谁的问题——后出现的元素总是在前面,为此,需要设置margin,以避免重叠:split.M阅读全文

posted @ 2011-08-26 23:49 linFen 阅读(135) 评论(0) 编辑

2011年7月27日

摘要: XPath语法 在C#中使用XPath示例 XPath可以快速定位到Xml中的节点或者属性。XPath语法很简单,但是强大够用,它也是使用xslt的基础知识。示例Xml:view sourceprint?01<?xml version="1.0" encoding="utf-8" ?> 02<pets> 03<cat color="black" weight="10"> 04<price>100</price> 05<desc>this is 阅读全文

posted @ 2011-07-27 07:45 linFen 阅读(126) 评论(0) 编辑

2011年7月26日

摘要: XSL即可扩展的样式表文件。 可以格式化xml的显示,也可以将xml转换成需要的另一种格式。学习XSL必须熟悉XPath。XSL和XPath一样简单强大,容易学习。1. XSL既然可以格式化xml的显示样式,我们先来看如何在xml中引用xsl文件如下代码示例:<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="url.xsl"?>只需在xml文件的文档声明后面添加<?xml-style阅读全文

posted @ 2011-07-26 22:46 linFen 阅读(96) 评论(0) 编辑

摘要: 漫谈SQL Server中的标识列(一)一、标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列。该种列具有以下三种特点:1、列的数据类型为不带小数的数值类型2、在进行插入(Insert)操作时,该列的值是由系统按一定规律生成,不允许空值3、列值不重复,具有标识表中每一行的作用,每个表只能有一个标识列。由于以上特点,使得标识列在数据库的设计中得到广泛的使用。二、标识列的组成创建一个标识列,通常要指定三个内容:1、类型(type)在SQL Server 2000中,标识列类型必须是数值类型,如下:decimal、int、numeric、smallint、bigint 阅读全文

posted @ 2011-07-26 22:02 linFen 阅读(136) 评论(0) 编辑

摘要: WPF快速指导6:触发器 本文摘要: 1:属性触发器; 2:数据触发器; 3:事件触发器; Style、ControlTemplate 和 DataTemplate 都有触发器集合。 属性触发器只检查WPF从属属性,而数据触发器则可检查任何一种可绑定的属性。属性触发器一般用来检查WPF可视元素的属性,而数据触发器则通常用来检查不可视对象的属性。 属性触发器:通过此机制,一个属性的更改会在另一个属性中触发即时或动态更改。 数据触发器:通过此机制,事件会在属性中触发动态更改。 数据触发器:EventTrigger,它根据事件的引发来启动一组操作,但这类操作仅限于动画。一:属性触发器 查看代码片段1阅读全文

posted @ 2011-07-26 21:50 linFen 阅读(108) 评论(0) 编辑

2011年6月14日

摘要: 如果自己来做一个UI框架,我们会首先关注哪些方面?我想UI框架主要处理的一定包括两个主要层次的内容,一个是数据展现,另一个就是数据操作,所以UI框架必须能够接收各种不同的数据并通过UI界面展现出来,然后可以通过控件行为来操作这些数据,也就是UI框架的数据(Data)和行为(Behavior)。 本篇从总体上讲解一下WPF如何处理和操作Data,看完之后大家应该对WPF框架如何把数据转变为展现界面有初步的认识,这也是WPF的核心设计之一。 数据(Data) 以前的UI框架的控件对控件数据类型都有规定,按钮上显示的是文本或者加上一个图片,下拉框显示的都是字符串或者带上一个object类型属性的作为阅读全文

posted @ 2011-06-14 13:58 linFen 阅读(110) 评论(0) 编辑

2011年6月10日

摘要: 概要:将所有的VM在加载到Application的Static Resource中,然后在View中用标签指定。实现:1)采用特性指定要添加到StaticResource中的对象view sourceprint?publicclassStaticResourceAttribute : Attribute { publicstringKey { get; set; } publicStaticResourceAttribute(stringkey) { this.Key = key; } }2)从当前的程序集中,把所有标记了StaticResourceAttribute的VM加载到AppReso阅读全文

posted @ 2011-06-10 07:26 linFen 阅读(155) 评论(0) 编辑

摘要: 一、背景:与用户界面 (UI) 相关的最大的问题就是大量的凌乱的代码,原因两个:(1) 用户界面包含负责的逻辑用于维护界面相关对象;(2) 其次也包含了应用程序状态的维护。用户界面的3大问题:状态 (State) , 逻辑 (Logic) ,同步 (Synchronization),其中状态是用户界面最关心的问题之一。二、简述MVC、MVP、MVVM(1) MVC:模型-视图-控制器(Model View Controller),它强制性的使应用程序的输入、处理和输出分开。(2) MVP:模型-视图-表现类(Model-View-Presenter)(3) MVVM:模型-视图-视图模型(Mo阅读全文

posted @ 2011-06-10 07:19 linFen 阅读(236) 评论(0) 编辑

摘要: Model-View-ViewModel (MVVM) 设计模式描述了构建 WPF 或 Silverlight 应用程序的常用方法。它还是一款构建应用程序的强大工具,以及一种与开发人员讨论应用程序设计的通用语言。虽然 MVVM 确实很有用,但它发展时间不长,用户尚未形成正确的认识。在MVVM模式中,你需要一个为View量身定制的model,那么这个model实际上就是上图ViewModel。ViewModel包含所有UI所需要的接口和属性,这样只需要通过Binding使他们进行关联,就可以使二者之间达到松散耦合,所以这样一来,UI就可以由UI专业人员用design和blend来实现(当然很多效阅读全文

posted @ 2011-06-10 07:05 linFen 阅读(166) 评论(0) 编辑

2011年5月26日

摘要: 在wpf中,在创建完控件之后,系统开始匹配控件所用的Style或者template。在程序中,可以用GetTemplateChild或者FindName来获得Resource中用x:Name="名字"声明的对象。 FindName是公共方法,而非受保护方法,它使用恰当的名称范围措施,从而可以访问某个元素中的模板并在其中查找命名项。 FindName()首先评估该FrameworkElement实例是否包含一个命名范围。如果该实例是一个xaml文件的root,则它包含一个命名范围。然而,如果该实例不包含一个命名空间,该方法则遍历可视树(visual tree),查找最近的命名阅读全文

posted @ 2011-05-26 11:30 linFen 阅读(158) 评论(0) 编辑

摘要: WPF 4 中DataGrid的模板列做双向数据绑定时,需要在绑定中指定UpdateSourceTrigger,如下:(WPFToolkit February 2010)<DataGridVirtualizingStackPanel.IsVirtualizing="True"VirtualizingStackPanel.VirtualizationMode="Recycling"Name="dataGrid1"AutoGenerateColumns="False"ItemsSource="{Bind阅读全文

posted @ 2011-05-26 11:28 linFen 阅读(327) 评论(0) 编辑

摘要: WPF程序中的单位是与设备无关的单位,每个单位是1/96英寸,如果电脑的DPI设置为96(每个英寸96个像素),那么此时每个WPF单位对应一个像素,不过如果电脑的DPI设备为120(每个英寸120个像素),那此时每个WPF单位对应应该是120/96=1.25个像素 一般在程序中我们常常需要得到当前屏幕的宽和高,常见做法有: 1.System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height 这两个方法可以返回当前屏幕选择的分辨率,该分辨率阅读全文

posted @ 2011-05-26 11:15 linFen 阅读(146) 评论(0) 编辑

摘要: 初学wpf今天做一个菜鸟级别实例,只适合菜鸟. 先上图 说明一下功能:显示总条数,选中条数.全选.点击datagrid勾选,也可多选 datagrid绑定的数据是用的一个数据过渡类,如有一个Student类,类中有Id,Name... 但没有总条数也没有当前选中条数(当然还有其他情况会跟这种情况类似时也会用到) 所以我就构造一个数据过渡类StudentData //数据实体类代码 1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545阅读全文

posted @ 2011-05-26 10:49 linFen 阅读(265) 评论(0) 编辑

摘要: 参考资料:(1). WPF:自动点击某个FrameworkElement(2). TestApi - a library of Test APIs(3). Introduction to TestApi – Part 1: Input Injection APIs1. 模拟用户输入的五种方式: (A)直接调用UI element的方法,例如:Button.IsPressed (B)利用可用的接口(UIA, MSAA, etc.),例如:AutomationElement(C)使用底层输入模拟,与操作系统相关,例如:Windows中的SendInput Win32 API和 Raw Input 阅读全文

posted @ 2011-05-26 10:47 linFen 阅读(80) 评论(0) 编辑

2011年5月24日

摘要: 1. 数据绑定(Binding)一般配置 常用的绑定的目标(Dependency Object & associated Dependency Property,目标单元): 内容控件目标:object ContentControl.Content 集合控件目标:IEnumerable ItemsControl.ItemSource 绑定器: Binding ( : BindingBase : MarkupExtension ) Binding binding = new Binding(); binding.ElementName = "WPF控件名称"; / b阅读全文

posted @ 2011-05-24 10:19 linFen 阅读(158) 评论(0) 编辑

2011年5月21日

摘要: using System.Management;查找CPU编号比较耗时.最好在其他线程调用.硬盘编号还快一些,但是分区后会变.如果硬盘克隆.硬盘编号也一样方法如下:View Code /// <summary> /// 取CPU编号 /// </summary> /// <returns></returns> public String GetCpuID() { try { ManagementClass mc = new ManagementClass("Win32_Processor"); ManagementObject阅读全文

posted @ 2011-05-21 07:59 linFen 阅读(61) 评论(0) 编辑

摘要: 先看显示效果:(图1)XAML(代码A):<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > <Canvas><!--这是使用PathFigureCollection的表示方法--><Path Stroke="Black" StrokeThickness="1" Fill阅读全文

posted @ 2011-05-21 07:56 linFen 阅读(107) 评论(0) 编辑

摘要: 第1种用 Task类. 推荐用这个办法 public void 工作_Task() { Dispatcher x = Dispatcher.CurrentDispatcher;//取得当前工作线程 //另开线程工作 Task<int> 计数 = new Task<int>(() => { return 计数方法(); }); 计数.ContinueWith(工作完毕后方法);//工作完毕后执行的方法 计数.Start();//开始工作 } public void 工作完毕后方法(Task<int> 参数) { if (参数.IsCompleted) /阅读全文

posted @ 2011-05-21 07:56 linFen 阅读(94) 评论(0) 编辑