|
|
2012年2月7日
新服务器发布网站时,遇到如下情况:
只有HTML能正常访问,其他诸如WebService,WCF等都不能访问,显示:Server Application Unavailable 的错误。
进入“事件查看器”,写明:没有权限访问System.Web。
但是我已经将Windows的文件夹的权限的用户设为了与访问该网站的用户的权限一致。
另外网上所传的新建应用程序池也不行。
最后,我的解决办法是:应用程序池的属性-》标识-》预定义账户-》改为“本地系统”,遇到安全提示不用去理他。
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
2011年12月6日
在开始之前,先熟悉几个类及部分属性、方法:CSharpCodeProvider、ICodeCompiler、CompilerParameters、CompilerResults、Assembly。
一、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; } } }
2011年11月24日
2011年11月9日
一、树面板简单示例
- var tree = Ext.create('Ext.tree.Panel', {
- title: '树面板简单示例',
- width : 150,
- height : 100,
- renderTo: Ext.getBody(),
- root: {
- text: '树根',
- expanded: true,
- children: [{
- text: '节点一',
- leaf: true
- }, {
- text: '节点二',
- leaf: true
- }]
- }
- });
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说明为叶子节点
}]
}
});
二、多列树示例
- 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
- }]
- }
- });
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
}]
}
});
三、树面板中的复选框示例
- var tree = Ext.create('Ext.tree.Panel', {
- title: '复选框示例',
- width : 150,
- height : 100,
- renderTo: Ext.getBody(),
- root: {
- text: '树根',
- expanded: true,
- children: [{
- text: '节点一',
- checked : true,
- leaf: true
- }, {
- text: '节点二',
- checked : false,
- leaf: true
- }]
- }
- });
摘要: 一、grid的例: Javascript代码 //配置表格列 {header:"姓名",width:50,dataIndex:'name'}, {header:"组长",width:50,dataIndex:'leader', xtype:'booleancolumn',//Ext.grid.column.Boolean布尔列 trueText:'是', falseText:'否'}, {header:"生日",width:100,dataIndex: 阅读全文
摘要: 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' 阅读全文
摘要: 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 阅读全文
一、addListener方法
- var button = Ext.get('btn');
- button.addListener('click',hello1);
- button.addListener('click',hello2);
var button = Ext.get('btn');
button.addListener('click',hello1);//绑定事件处理函数
button.addListener('click',hello2);
二、ExtJS支持的自定义事件
-
- 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('发生了自定义事件');
- });
//创建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('发生了自定义事件');
});
- <input type='button' value='say' onclick='per.say()'>
<input type='button' value='say' onclick='per.say()'>
自定义事件的另外一个例子:
-
- 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);
- });
//继承自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');//创建对象”代码之后的内容替换为:
- per.addListener('onSay',handler);
- function handler(){
- alert('发生了自定义事件');
- }
-
- Ext.util.Observable.capture(per,captureFunction);
-
- function captureFunction(eventName){
- if(eventName == 'onSay'){
- alert("拦截事件:“"+eventName+"”。");
- return false;
- }
- return true;
- }
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受管事件监听器:
- 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.addManagedListener(Ext.getCmp('openBtn'),'click',openFn);
- 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传播分发事件:
-
- 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)
- }
- });
-
-
- 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();
-
-
-
- waiter.relayEvents(emp, ['finishEat']);
- waiter.on('finishEat',function(){
- alert('服务员开始收拾盘子。');
- });
//创建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('服务员开始收拾盘子。');
});
- <input type='button' value='员工吃饭' onclick='emp.eat()'>
<input type='button' value='员工吃饭' onclick='emp.eat()'>
五、Ext.EventObject示例
- var btn = Ext.get('buttonTest');
- btn.addListener('click',handler);
- function handler(e){
-
- var x = e.getPageX();
-
- var y = e.getPageY();
- var msg = '事件发生坐标 : x='+x+' y='+y;
- alert(Ext.EventManager.getPageXY(e));
- alert(msg);
- }
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使用
- Ext.EventManager.addListener('btn','click',handler);
摘要: 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 阅读全文
- <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>
<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代码:
- <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
- <%
- String bookName = request.getParameter("searchbook");
- String jav = "['java编程思想'],['java入门'],['javascript程序设计']";
- String cpp = "['c++编程思想'],['c++入门'],['c++程序设计']";
- String php = "['php程序设计'],['php入门'],['php从入门到精通']";
- String books = "";
- if(bookName.equals("allbook")){
- books = "["+jav+","+cpp+","+php+"]";
- response.getWriter().write(books);
- return;
- }else{
- bookName = bookName.substring(0,3);//取查询字符串的前3个字符
- System.out.println(bookName);
-
- if(bookName.equals("jav")){
- books = "["+jav+"]";
- }else if(bookName.equals("c++")){
- books = "["+cpp+"]";
- }else if(bookName.equals("php")){
- books = "["+php+"]";
- }else{
- books = "[['没有数据']]";
- }
- response.getWriter().write(books);
- }
- %>
摘要: 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 阅读全文
摘要: 一、基础知识 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对 阅读全文
摘要: 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 阅读全文
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. 阅读全文
摘要: 目标:介绍Panel布局的各种类 Panel布局类在VS中的介绍内容:Panel布局类有10种:容器布局,自适应布局,折叠布局,卡片式布局,锚点布局,绝对位置布局,表单布局,列布局,表格布局,边框布局 1,Ext.layout.ContainerLayout 容器布局 提供容器作为布局的基础逻辑,通常会被扩展而不通过new关键字直接创建,一般作为默认布局存在 2,Ext.layout.FitLayout 自适应布局使用layout:'fit' 将使面板子元素自动充满容器,如果有多个子面板也只会第一个会被显示 3,Ext.layout.AccordionLayout 折叠布局 ( 阅读全文
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, 阅读全文
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 阅读全文
摘要: 类 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 阅读全文
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 阅读全文
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 阅读全文
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 阅读全文
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 阅读全文
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 阅读全文
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 阅读全文
摘要: 漫谈SQL Server中的标识列(一)一、标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列。该种列具有以下三种特点:1、列的数据类型为不带小数的数值类型2、在进行插入(Insert)操作时,该列的值是由系统按一定规律生成,不允许空值3、列值不重复,具有标识表中每一行的作用,每个表只能有一个标识列。由于以上特点,使得标识列在数据库的设计中得到广泛的使用。二、标识列的组成创建一个标识列,通常要指定三个内容:1、类型(type)在SQL Server 2000中,标识列类型必须是数值类型,如下:decimal、int、numeric、smallint、bigint 阅读全文
摘要: WPF快速指导6:触发器 本文摘要: 1:属性触发器; 2:数据触发器; 3:事件触发器; Style、ControlTemplate 和 DataTemplate 都有触发器集合。 属性触发器只检查WPF从属属性,而数据触发器则可检查任何一种可绑定的属性。属性触发器一般用来检查WPF可视元素的属性,而数据触发器则通常用来检查不可视对象的属性。 属性触发器:通过此机制,一个属性的更改会在另一个属性中触发即时或动态更改。 数据触发器:通过此机制,事件会在属性中触发动态更改。 数据触发器:EventTrigger,它根据事件的引发来启动一组操作,但这类操作仅限于动画。一:属性触发器 查看代码片段1 阅读全文
2011年6月14日
摘要: 如果自己来做一个UI框架,我们会首先关注哪些方面?我想UI框架主要处理的一定包括两个主要层次的内容,一个是数据展现,另一个就是数据操作,所以UI框架必须能够接收各种不同的数据并通过UI界面展现出来,然后可以通过控件行为来操作这些数据,也就是UI框架的数据(Data)和行为(Behavior)。 本篇从总体上讲解一下WPF如何处理和操作Data,看完之后大家应该对WPF框架如何把数据转变为展现界面有初步的认识,这也是WPF的核心设计之一。 数据(Data) 以前的UI框架的控件对控件数据类型都有规定,按钮上显示的是文本或者加上一个图片,下拉框显示的都是字符串或者带上一个object类型属性的作为 阅读全文
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 阅读全文
摘要: 一、背景:与用户界面 (UI) 相关的最大的问题就是大量的凌乱的代码,原因两个:(1) 用户界面包含负责的逻辑用于维护界面相关对象;(2) 其次也包含了应用程序状态的维护。用户界面的3大问题:状态 (State) , 逻辑 (Logic) ,同步 (Synchronization),其中状态是用户界面最关心的问题之一。二、简述MVC、MVP、MVVM(1) MVC:模型-视图-控制器(Model View Controller),它强制性的使应用程序的输入、处理和输出分开。(2) MVP:模型-视图-表现类(Model-View-Presenter)(3) MVVM:模型-视图-视图模型(Mo 阅读全文
摘要: Model-View-ViewModel (MVVM) 设计模式描述了构建 WPF 或 Silverlight 应用程序的常用方法。它还是一款构建应用程序的强大工具,以及一种与开发人员讨论应用程序设计的通用语言。虽然 MVVM 确实很有用,但它发展时间不长,用户尚未形成正确的认识。在MVVM模式中,你需要一个为View量身定制的model,那么这个model实际上就是上图ViewModel。ViewModel包含所有UI所需要的接口和属性,这样只需要通过Binding使他们进行关联,就可以使二者之间达到松散耦合,所以这样一来,UI就可以由UI专业人员用design和blend来实现(当然很多效 阅读全文
2011年5月26日
摘要: 在wpf中,在创建完控件之后,系统开始匹配控件所用的Style或者template。在程序中,可以用GetTemplateChild或者FindName来获得Resource中用x:Name="名字"声明的对象。 FindName是公共方法,而非受保护方法,它使用恰当的名称范围措施,从而可以访问某个元素中的模板并在其中查找命名项。 FindName()首先评估该FrameworkElement实例是否包含一个命名范围。如果该实例是一个xaml文件的root,则它包含一个命名范围。然而,如果该实例不包含一个命名空间,该方法则遍历可视树(visual tree),查找最近的命名 阅读全文
摘要: WPF 4 中DataGrid的模板列做双向数据绑定时,需要在绑定中指定UpdateSourceTrigger,如下:(WPFToolkit February 2010)<DataGridVirtualizingStackPanel.IsVirtualizing="True"VirtualizingStackPanel.VirtualizationMode="Recycling"Name="dataGrid1"AutoGenerateColumns="False"ItemsSource="{Bind 阅读全文
摘要: 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 这两个方法可以返回当前屏幕选择的分辨率,该分辨率 阅读全文
摘要: 初学wpf今天做一个菜鸟级别实例,只适合菜鸟. 先上图 说明一下功能:显示总条数,选中条数.全选.点击datagrid勾选,也可多选 datagrid绑定的数据是用的一个数据过渡类,如有一个Student类,类中有Id,Name... 但没有总条数也没有当前选中条数(当然还有其他情况会跟这种情况类似时也会用到) 所以我就构造一个数据过渡类StudentData //数据实体类代码 1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545 阅读全文
摘要: 参考资料:(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 阅读全文
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 阅读全文
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 阅读全文
摘要: 先看显示效果:(图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 阅读全文
摘要: 第1种用 Task类. 推荐用这个办法 public void 工作_Task() { Dispatcher x = Dispatcher.CurrentDispatcher;//取得当前工作线程 //另开线程工作 Task<int> 计数 = new Task<int>(() => { return 计数方法(); }); 计数.ContinueWith(工作完毕后方法);//工作完毕后执行的方法 计数.Start();//开始工作 } public void 工作完毕后方法(Task<int> 参数) { if (参数.IsCompleted) / 阅读全文
|