[转载]actionscript3.0简单粒子效果

mikel阅读(1151)

[转载]actionscript3.0简单粒子效果 – 火星人 – 博客园.

从天地会论坛的MoonSpirit师兄那里学来了用actionscript3.0中的BitmapData粒子实现一个简单的图片演示效果。

particleVO.as:

   1:  package com.helloshp.vo
   2:  {
   3:      import flash.display.BitmapData;
   4:  
   5:      //粒子对象属性
   6:      public class ParticleVO
   7:      {
   8:          public var bmd:BitmapData;//用来装载切图
   9:          public var crtPosX:Number;//该粒子对象当前出现在舞台的X位置
  10:          public var crtPosY:Number;//该粒子对象当前出现在舞台的Y位置
  11:          public var tragetX:Number;//该粒子最后要运动到的舞台的X位置
  12:          public var tragetY:Number;//该粒子最后要运动到的舞台的Y位置
  13:      }
  14:  }

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas,”Courier New”,courier,monospace; background-color: rgb(255, 255, 255); }.csharpcode pre { margin: 0em; }.csharpcode .rem { color: rgb(0, 128, 0); }.csharpcode .kwrd { color: rgb(0, 0, 255); }.csharpcode .str { color: rgb(0, 96, 128); }.csharpcode .op { color: rgb(0, 0, 192); }.csharpcode .preproc { color: rgb(204, 102, 51); }.csharpcode .asp { background-color: rgb(255, 255, 0); }.csharpcode .html { color: rgb(128, 0, 0); }.csharpcode .attr { color: rgb(255, 0, 0); }.csharpcode .alt { background-color: rgb(244, 244, 244); width: 100%; margin: 0em; }.csharpcode .lnum { color: rgb(96, 96, 96); }

Main.as:

   1:  package
   2:  {
   3:      import com.helloshp.vo.ParticleVO;
   4:  
   5:      import flash.display.Bitmap;
   6:      import flash.display.BitmapData;
   7:      import flash.display.Sprite;
   8:      import flash.events.Event;
   9:      import flash.events.MouseEvent;
  10:      import flash.events.TimerEvent;
  11:      import flash.geom.Point;
  12:      import flash.geom.Rectangle;
  13:      import flash.utils.Timer;
  14:  
  15:      [SWF(width="800",height="600")]
  16:      public class Main extends Sprite
  17:      {
  18:          [Embed(source="assets/imgTest0.jpg")]
  19:          private var imgTest0:Class;
  20:          [Embed(source="assets/imgTest1.jpg")]
  21:          private var imgTest1:Class;
  22:          [Embed(source="assets/imgTest2.jpg")]
  23:          private var imgTest2:Class;
  24:          [Embed(source="assets/imgTest3.jpg")]
  25:          private var imgTest3:Class;
  26:          [Embed(source="assets/imgTest4.jpg")]
  27:          private var imgTest4:Class;
  28:  
  29:          private var bmpimgTest:Bitmap;
  30:          private var bmp:Bitmap;
  31:          private var bmd:BitmapData;
  32:          private var particleVOList:Array;
  33:          private var currentIndex:int;
  34:          private var isStop:Boolean;
  35:          private var timer:Timer;
  36:  
  37:          public function Main()
  38:          {
  39:              init();
  40:          }
  41:  
  42:          private function init():void{
  43:              initData();
  44:              addEventListener(Event.ENTER_FRAME,efHandler);
  45:              stage.addEventListener(MouseEvent.CLICK,clickHandler);
  46:              timer = new Timer(3500);
  47:              timer.addEventListener(TimerEvent.TIMER,timerHandler);
  48:              timer.start();
  49:          }
  50:  
  51:          private function initData():void{
  52:              //清除舞台所以的可视对象
  53:              for(;this.numChildren>0;){
  54:                  this.removeChildAt(0);
  55:              }
  56:  
  57:              //实例化用于创建粒子对象的数组
  58:              particleVOList = new Array();
  59:              //把即将要切片的imgTest.jpg图片装载到一个Bitmap视图容器里面
  60:              bmpimgTest = getImg( currentIndex );
  61:              //实例化待加载切图的画布
  62:              bmd = new BitmapData(800,600,true,0);
  63:              //把画布加载到显示容器里面去,等哈儿显示所有的粒子对象用
  64:              bmp = new Bitmap( bmd );
  65:              //把显示容器加载到舞台
  66:              addChild(bmp);
  67:              //初始化粒子对象
  68:              initParticleVO();
  69:          }
  70:  
  71:          private function getImg(crtIndex:int):Bitmap{
  72:              switch(crtIndex){
  73:                  case 0:
  74:                      return new imgTest0();
  75:                      break;
  76:                  case 1:
  77:                      return new imgTest1();
  78:                      break;
  79:                  case 2:
  80:                      return new imgTest2();
  81:                      break;
  82:                  case 3:
  83:                      return new imgTest3();
  84:                      break;
  85:                  case 4:
  86:                      return new imgTest4();
  87:                      break;
  88:                  default:
  89:                      return new imgTest0();
  90:                      break;
  91:              }
  92:  
  93:          }
  94:  
  95:          //当鼠标点击后,暂停或者继续播放
  96:          private function clickHandler(e:MouseEvent):void{
  97:              isStop = isStop?false:true;
  98:              if(isStop){
  99:                  timer.stop();
 100:              }
 101:              else{
 102:                  timer.reset();
 103:                  timer.start();
 104:              }
 105:  
 106:          }
 107:  
 108:          //初始化所有的粒子对象,每个粒子对象其实就是把加载的testImg图片,通过2重循环切成一个一个的bitmapData,
 109:          //并设置每个粒子对象的当前坐标(待会儿舞台显示出现的位置),目标坐标(就是粒子对象要移动到的位置),并存放到数组。
 110:          //通过2重循环切testImg图的时候关键是,新建立一个尺寸10 X 10 大小的bitmapData对象,然后通过它的copyPixels()方法去切加载的图片。
 111:          //copyPixels(),的参数1: 就是要切的图片对象的bitmapData,参数2: 创建一个要切的那一个方块对象,该方块对象的x,y坐标就是该方块最终要放置到舞台上的坐标
 112:          //参数3:切图的坐标点,默认设置为原点。        
 113:          private function initParticleVO():void{
 114:              //行数为50行,因为每次切图的高就是10像素,60*10=600,刚好就是我的图片的高            
 115:              for( var row:int=0;row<60;row++ ){
 116:                  //宽度为80行,因为每次切图的宽就是10像素,80*10=800,刚好就是我的图片的宽
 117:                  for(var col:int=0;col<80;col++){
 118:                      //初始化每一个粒子VO
 119:                      var pvo:ParticleVO = new ParticleVO();
 120:                      pvo.tragetX = col * 10;//粒子目标X坐标(就是粒子对象最终要移动到的X位置)
 121:                      pvo.tragetY = row * 10;//粒子目标Y坐标(就是粒子对象最终要移动到的Y位置)                    
 122:                      pvo.crtPosX = col * 10 + Math.random() * 1000; //粒子在舞台显示的X位置.通过随机数打乱初始位置
 123:                      pvo.crtPosY = row * 10 + Math.random() * 1000;//粒子在舞台显示的Y位置,通过随机数打乱初始位置
 124:                      pvo.bmd = new BitmapData(10,10,true,0);//创建一个空白的画布
 125:                      //关键代码,就是切图操作
 126:                      pvo.bmd.copyPixels( bmpimgTest.bitmapData,new Rectangle(pvo.tragetX,pvo.tragetY,10,10),new Point() );
 127:                      //把每个切出来的图,装载到一个数组里面(等哈儿再渲染到舞台上出来)
 128:                      particleVOList.push( pvo );
 129:                  }
 130:              }
 131:          }
 132:  
 133:          private function efHandler(e:Event):void{
 134:              if(isStop) return;
 135:              //bmd.lock()
 136:              //创建一个800 X 600 的空白的画布
 137:              bmd = new BitmapData(800,600,true,0);
 138:              //循环取出每一个刚刚切好的图片,然后再转载到画布里面
 139:              for(var i:int=0;i<particleVOList.length;i++){
 140:                  var pvo:ParticleVO = particleVOList[i];
 141:                  pvo.crtPosX += ( pvo.tragetX - pvo.crtPosX ) / ( 2 + Math.random() * 20 );//X轴缓动效果
 142:                  pvo.crtPosY += ( pvo.tragetY - pvo.crtPosY ) / ( 2 + Math.random() * 20) ;//Y轴缓动效果
 143:                  //关键代码,把数组里面装的每一个小的切图,装载到800 X 600 的大的画布里面去。装载的时候,都是按照粒子对象对应的X,Y坐标装载的。
 144:                  bmd.copyPixels( pvo.bmd, new Rectangle(0,0,10,10 ),new Point(pvo.crtPosX,pvo.crtPosY) );
 145:              }
 146:              //把装载好的画布,赋值给显示对象,让可视对象bmp在舞台上渲染出图片出来
 147:              bmp.bitmapData = bmd;
 148:              //bmd.unlock();
 149:          }
 150:  
 151:          private function timerHandler(e:TimerEvent):void{
 152:              currentIndex++;
 153:              if(currentIndex > 4 ){
 154:                  currentIndex = 0;
 155:              }
 156:              initData();
 157:          }
 158:      }
 159:  }
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas,”Courier New”,courier,monospace; background-color: rgb(255, 255, 255); }.csharpcode pre { margin: 0em; }.csharpcode .rem { color: rgb(0, 128, 0); }.csharpcode .kwrd { color: rgb(0, 0, 255); }.csharpcode .str { color: rgb(0, 96, 128); }.csharpcode .op { color: rgb(0, 0, 192); }.csharpcode .preproc { color: rgb(204, 102, 51); }.csharpcode .asp { background-color: rgb(255, 255, 0); }.csharpcode .html { color: rgb(128, 0, 0); }.csharpcode .attr { color: rgb(255, 0, 0); }.csharpcode .alt { background-color: rgb(244, 244, 244); width: 100%; margin: 0em; }.csharpcode .lnum { color: rgb(96, 96, 96); }代码下载:http://files.cnblogs.com/bigbigdotnet/particle.rar

[转载]WPF下可编辑Header的Tab控件实现

mikel阅读(950)

[转载]WPF下可编辑Header的Tab控件实现 – 葡萄城控件技术团队博客 – 博客园.

介绍

有这样一个需求,当用户双击Tab控件Header区域时, 希望可以直接编辑。对于WPF控件,提供一个ControlTemplate在加上一些Trigger就可以实现。效果如下:

代码

首先,我们需要给Tab Header设计一个ControlTemplate。类似一个TextBlock,双击进入编辑状态。 所以Xaml如下:

<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:EditableTabHeaderControl}">
<Grid>
<TextBox x:Name="PART_TabHeader" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content, Mode=TwoWay}" Visibility="Collapsed"/>
<TextBlock x:Name="PART_TextBlock" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content, Mode=TwoWay}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsInEditMode" Value="True">
<Trigger.Setters>
<Setter TargetName="PART_TabHeader" Property="Visibility" Value="Visible"/>
<Setter TargetName="PART_TextBlock" Property="Visibility" Value="Collapsed"/>
</Trigger.Setters>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>

接下来,我们需要定义个“EditableTabHeaderControl”类,它具有控制TextBox和TextBlock的能力。如下:

namespace EditableTabHeaderDemo
{
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Threading;
/// <summary>
/// Header Editable TabItem
/// </summary>
[TemplatePart(Name = "PART_TabHeader", Type = typeof(TextBox))]
public class EditableTabHeaderControl : ContentControl
{
/// <summary>
/// Dependency property to bind EditMode with XAML Trigger
/// </summary>
private static readonly DependencyProperty IsInEditModeProperty = DependencyProperty.Register("IsInEditMode", typeof(bool), typeof(EditableTabHeaderControl));
private TextBox textBox;
private string oldText;
private DispatcherTimer timer;
private delegate void FocusTextBox();
/// <summary>
/// Gets or sets a value indicating whether this instance is in edit mode.
/// </summary>
public bool IsInEditMode
{
get
{
return (bool)this.GetValue(IsInEditModeProperty);
}
set
{
if (string.IsNullOrEmpty(this.textBox.Text))
{
this.textBox.Text = this.oldText;
}
this.oldText = this.textBox.Text;
this.SetValue(IsInEditModeProperty, value);
}
}
/// <summary>
/// When overridden in a derived class, is invoked whenever application code or internal processes call <see cref="M:System.Windows.FrameworkElement.ApplyTemplate"/>.
/// </summary>
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
this.textBox = this.Template.FindName("PART_TabHeader", this) as TextBox;
if (this.textBox != null)
{
this.timer = new DispatcherTimer();
this.timer.Tick += TimerTick;
this.timer.Interval = TimeSpan.FromMilliseconds(1);
this.LostFocus += TextBoxLostFocus;
this.textBox.KeyDown += TextBoxKeyDown;
this.MouseDoubleClick += EditableTabHeaderControlMouseDoubleClick;
}
}
/// <summary>
/// Sets the IsInEdit mode.
/// </summary>
/// <param name="value">if set to <c>true</c> [value].</param>
public void SetEditMode(bool value)
{
this.IsInEditMode = value;
this.timer.Start();
}
private void TimerTick(object sender, EventArgs e)
{
this.timer.Stop();
this.MoveTextBoxInFocus();
}
private void MoveTextBoxInFocus()
{
if (this.textBox.CheckAccess())
{
if (!string.IsNullOrEmpty(this.textBox.Text))
{
this.textBox.CaretIndex = 0;
this.textBox.Focus();
}
}
else
{
this.textBox.Dispatcher.BeginInvoke(DispatcherPriority.Render, new FocusTextBox(this.MoveTextBoxInFocus));
}
}
private void TextBoxKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
this.textBox.Text = oldText;
this.IsInEditMode = false;
}
else if (e.Key == Key.Enter)
{
this.IsInEditMode = false;
}
}
private void TextBoxLostFocus(object sender, RoutedEventArgs e)
{
this.IsInEditMode = false;
}
private void EditableTabHeaderControlMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
this.SetEditMode(true);
}
}
}
}

这里有一个问题,当控件进入编辑状态,TextBox变为可见状态时,它不能自动获得focus。一种解决办法是挂一个Timer,每1毫秒轮询一次,检查状态并控制focus。

现在就来添加一个WPF TabControl,并应用ItemContainerStyle。然后双击Header,可以编辑啦~

<Window x:Class="EditableTabHeaderDemo.MainWindow"
xmlns:local="clr-namespace:EditableTabHeaderDemo"
Title="EditableTabHeaderDemo" Height="300" Width="500">
<Window.Resources>
<Style x:Key="EditableTabHeaderControl" TargetType="{x:Type local:EditableTabHeaderControl}">
<!-- The template specified earlier will come here !-->
</Style>
<Style x:Key="ItemContainerStyle" TargetType="TabItem">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<local:EditableTabHeaderControl
Style="{StaticResource EditableTabHeaderControl}">
<local:EditableTabHeaderControl.Content>
<Binding Path="Name" Mode="TwoWay"/>
</local:EditableTabHeaderControl.Content>
</local:EditableTabHeaderControl>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
<DataTemplate x:Key="ContentTemplate">
<Grid>
<TextBlock HorizontalAlignment="Left" Text="{Binding Name}"/>
<TextBlock HorizontalAlignment="Center" Text="{Binding City}"/>
</Grid>
</DataTemplate>
</Window.Resources>
<Grid>
<TabControl Grid.Row="0" ItemsSource="{Binding Data}" ItemContainerStyle="{StaticResource ItemContainerStyle}" ContentTemplate="{StaticResource ContentTemplate}" />
</Grid>
</Window>

许可证

本文以及示例代码文件遵循The Code Project Open License(CPOL)

源码下载

EditableTabHeaderSolution.zip

英文链接:Header Editable Tab Control in Wpf

[转载]Android 资源的国际化

mikel阅读(907)

[转载]Android 资源的国际化 – 彬彬的博客 – 博客园.

但是在实际应用开发中,通常横屏(land)与竖屏(port)布局文件有所不同,这时候我们可以独自定义横屏与竖屏的布局文件( 文件名字要一样),默认情况是加载layout目录里的布局文件。同样应用还要支持不同的语言,如果我们应用里没有定义手机所用语言的资源时,会默认加载 values的值。

要使程序适应布局,则需要添加以下两个目录:layout-land 和 layout-port ,系统在进行改变的时候,将会根据这两个现在的屏幕的横竖分别读取这两种不同的布局方式,如果这当前的不存在,则会根据layout中的布局进行布局。

下面是我的的三个布局:

layout:

代码

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:id="@+id/text1" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/btn1" android:text="坚" android:layout_width="fill_parent" android:layout_height="wrap_content"> </Button> <Button android:id="@+id/btn2" android:text="横" android:layout_width="fill_parent" android:layout_height="wrap_content"> </Button> </LinearLayout>

layout-land:

代码

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="横屏显示" /> <TextView android:layout_width="fill_parent" android:id="@+id/text1" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/btn1" android:text="横" android:layout_width="fill_parent" android:layout_height="wrap_content"> </Button> <Button android:id="@+id/btn2" android:text="竖" android:layout_width="fill_parent" android:layout_height="wrap_content"> </Button> </LinearLayout>

显示效果:

layout-port:

代码

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="坚屏显示" /> <TextView android:layout_width="fill_parent" android:id="@+id/text1" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/btn1" android:text="横" android:layout_width="fill_parent" android:layout_height="wrap_content"> </Button> <Button android:id="@+id/btn2" android:text="竖" android:layout_width="fill_parent" android:layout_height="wrap_content"> </Button> </LinearLayout>

显示效果:

下面是对内容的显示进行的国际化:

需要添加以下目录:

values-zh-rCN 此下面放置的是显示中文内容的

values-zh-rTW 此下显示繁体中文

values-jp  显示日文

一般形式为:values-国家编号

这些显示将根据操作系统的语言进行读取,如果不存在相应的语言版本,将会直接获取values中的内容:

在此中,只对中文进行了设置

values中的内容如下:

<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, ShowTask!</string> <string name="app_name">ShowTask</string> </resources>

values-zh-rCN 中的内容如下:

<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">此程序用于显示任务!</string> <string name="app_name">显示任务</string> </resources>

显示效果如下:

参考文章:

http://www.android123.com.cn/androidkaifa/206.html

[转载]新年快乐,介绍个简单的Excel理财工作的制作方法

mikel阅读(760)

[转载]新年快乐,介绍个简单的Excel理财工作的制作方法 – Killmyday – 博客园.

最近物价飞涨,得给钱找个保值的地方,朋友给我推荐了一个不错的楼盘投资保值,实 在不行自住也很舒服。这么一大笔的投资,为了验证一下保值的潜力,当然需要慎之又慎,小心的不能再小心。作决定前自然要估计一下收益如何,这种纷繁复杂的 计算,虽然每一步都是很简单的运算,但是很多步串起来,就有点顾此失彼了。因此就想到用Excel自己做一个分析工具,省去自己编程的麻烦,可能你也有类似的需求,就把制作方法介绍如下。

设计的目标:

1. 用户需要输入房子的单价、面积以及购买时间。

2. 用户需要输入首付和公积金贷款的总额,程序能够计算出每个月的还贷的压力。

3. 用户输入预计房子的出售时间以及出售时每平的单价,程序能够根据出售时间和单价的变化,计算出总利润和均摊到每个月的利润。

4. 最后,用户可以修改一些其他参数,例如商业贷款利率,公积金贷款利率,还款年限,出售房屋的手续费等。

自动计算利润的表格如下所示(可以通过修改第一列的每平售价和第一行的出售时间来分析盈亏):

制作步骤:

1. 分析每月还贷压力,表格截图如下:

其中C2D2分别是允许用户输入的购买单价和房屋面积,E2是购买时间—留着做出售时获利分析。

房屋的总价B2就是简单的:=C2 * D2

因为公积金贷款各地都有政策,而且都有贷款上限,所以我在D7这个单元格输入了公积金的贷款上限,逻辑是,能从公积金贷就从公积金贷,如果不能贷,就把D7这个值设置为0好了。

B7里,就是(房屋总价首付)和公积金贷款上限的最小值—如果公积金贷款能全部搞定,为什么要贷商业贷款呢?因此B7的公式就是:=MIN($D$7, $B$2-$B$5)

商业贷款B6的值就是剩下要贷款的总额了:=IF(B2-B5-B7>0, B2-B5-B7,0)

Excel自己带了等额本息还款方式的计算每月还贷的公式PMTPMT函数接受3个参数:

1) 第一个参数是月利率,比如说你的贷款年利率是5.22%的话,那月利率就是5.22%除以12

2) 第二个参数是还款周期,以月份计算,即如果你的贷款是20年的话,那就应该是240 = 20 * 12

3) 第三个参数是贷款的总额。

因此B10每个月商业贷款的还款是:=PMT($B$3/12, $B$8*12, $B$6)

B9每个月公积金贷款的汇款是:=IF($B$7=0, 0, PMT($B$4/12, $B$8*12, $B$7))

还款总额就是将每个月的固定的还款乘以还款周期,例如B13的商业贷款总额是:=$B$10 * $B$8*12

2. 根据指定的出售时间和价格,计算利润,表格截图如下:

根据最近出台的房屋出售营业税规定,如果是购买5年之内的住宅出售所得,需要交纳房价差额(卖价与买价的差额)的5.55%作为营业税,如果房子是5年以上的,则免交营业税。

第一步先计算出出售时间和购买时间的时差,Excel提供了一个函数,YEARFRAC就是用来计算两个时间间隔的年份的。因此D21的公式是:=YEARFRAC(E2, E19, 3)*12。即出售时间减去购买时间的年份乘以12—我使用月份来表示,是因为在按出售时间分析利润时,公式编写会方便一些。

出售房屋时,包括几个成本:当初的首付成本—B5,已还的贷款以及提前还贷需要还得本金。在等额本息还款方法里,前面月份还的钱大部分都是利息—不是本金,换句话说,已还贷款里大部分都是要交给银行的利息,所以提前还贷还不是简单的预计贷款还款总额减去已还的贷款。

Excel提供了一个函数,CUMPRINC可以用来计算在指定的还款次数后,总共还贷的本金额度,用法跟PMT类似。因此,实际缴纳商业贷款本金B23的公式是:=CUMPRINC(B3/12, B8*12, B6, 1,D21+1,1)

最后实际出售所得B26 实际成本B25就是我们的利润B27了。

3. 变动出售时间和价格,分析利润,表格截图如下:

设置B29的公式为:=B27,一定要指定公式,不要指定值,否则Excel无法从公式链表里,使用参数表个里面的值替换匹配公式的单元格。

C29E29(当然Z29也可以—如果你觉得有必要分析这么长的时间的话)这一行设置要分析的出售时间。

B30B42这一列设置要分析的出售单价。

选中B29E42这一个范围,点击菜单里的“数据”-> What-if分析”->“数据表”:

在弹出的对话框里:

l 设置行输入单元格(Row input cell)为E19,即我们在第二步计算中使用的出售时间。

l 设置列输入单元格(Column input cell)为C19,即我们在第二步计算中使用的出售单价。

最后就可以看到随着出售时间和单价的变化,总利润的变化了。

好啦,当前物价飞涨,跑不过刘翔,也要争取跑过CPI呀。新年快乐,恭喜发财,附送一个简单的小程序,示例文件下载:/Files/killmyday/Excel_Sample.zip

[转载]InfoQ: Silverlight 之轻

mikel阅读(950)

[转载]InfoQ: Silverlight 之轻.

【编者按】在企业应用的前端开发中,Ajax、Flash和Silverlight争奇斗艳,各有千秋。这次InfoQ中文站有幸邀请到来自中国人寿的Silverlight专家吴磊先生,为读者分享他的Silverlight在企业应用开发中的丰富经验。

就在笔者写下本文的当天,第二届Silverlight Firestarter 发布会在美国召开,微软企业副总裁 Scott Guthrie 发布了Silverlight 5 的一系列新特性,并宣布Silverlight 5 将注重丰富的媒体体验与企业应用开发两大方面的改进。其中针对媒体方面的改进包括GPU硬解码、H.264等5项功能,而针对企业应用方面的改进包括64 位操作系统支持、IE 9硬件加速、向量打印、文本清晰度、调用非托管代码等30多项功能,可以看出Silverlight已经逐渐将其未来重心转向企业级应用方面(一直以来, 笔者都认为Silverlight的强项应该是企业应用)。

Silverlight作为微软“三屏一云”战略中展现层的重要技术,越来越引起企业开发者的注意。新浪财经、腾讯、淘宝、口碑网等互联网企业已经 尝试使用Silverlight开发交互性较强的商业应用,而一贯谨慎保守的大型金融公司陆续开始使用Silverlight来提高企业应用的用户体验, 比如中国人寿(网上服务应用)、中国人保(商务智能应用)已经有相关应用,而像花旗银行、工商银行这样的大型银行也在尝试使用Silverlight来实 现未来网上银行一些功能。

为什么Silverlight在推出短短三年左右时间内就能触动企业开发者呢?原因很简单,Silverlight具有良好的后台语言框架支持,这就是基于.Net高级语言的精简运行环境。具体而言原因有三:

  1. Silverlight之轻,即较之WPF、Java Swing、Delphi等C\S架构有更加轻量的运行环境与零维护的特点:使用轻量的CLR Core运行时环境,不依赖于客户端环境(无须安装体积庞大的.Net Framework,这一点太棒了)。
  2. Silverlight之重,即较之Html+JavaScript等B/S架构有更优越的客户端弹性:使用C#高级语言代替 JavaScript来实现强大的客户端计算能力、支持多线程,继承了WPF丰富的样式、控件、特效与动画,更可控的浏览器适应性,更安全的沙箱模式,客 户端嵌入式数据库等。
  3. Silverlight之美,即较之传统应用有更友好的交互性,更酷的效果。支持完全面向用户体验的开发过程,其快速原型工具使需求与交付物更为明确,用户体验驱动开发,设计与编码分离。

在本文中,笔者要着重强调的是“Silverlight之轻!”, Silverlight是企业应用展现层的轻量级解决方案,从本文开始,笔者将采用连载的方式与大家一起探讨Silverlight在企业级应用解决方案与特性。

现在越来越多的企业已经开始考虑将原有“竖井状”的C/S与B/S架构通过SOA等理念进行重构与集成,譬如建立以客户、产品、合同为中心的主数据 管理平台(MDM),采用数据即服务的方式对逻辑层提供服务,使用企业服务总线(ESB)对这些服务进行消息路由、转换、监控及生命期管理,通过业务流程 管理平台(BPM)混编服务实现业务流程自动化,通过业务规则管理平台(BRM)实现对业务逻辑自动化,最后这些应用层服务形成了企业应用的服务器端处理 逻辑。而展现层就是企业应用中实现人机交互的最后一步,即信息的输入与展现。现在的企业应用解决方案中基于窗体的C/S与基于浏览器的B/S架构几乎构成 了企业应用的全部,但两者都有其优缺点,C/S架构在客户端的处理能力与交互性较强,但维护性极差;相反,B/S架构在客户端的维护性极高,但对信息的处 理能力、交互性、跨浏览器一致性方面都有不足。正是如此,相对C/S架构更为轻型的Silverlight技术就成为了未来高度集成化的企业应用中理想的 展现层的候选方案。传统的C/S架构,无论是VC++、Delphi、Java的Swing、还是.Net的WinForm、WPF都需要安装体积笨重的 运行时环境,即使客户端程序永远不会使用运行环境中的特殊组件,但使用者也只能被动接受这些组件占用计算机资源。而Silverlight有着更为轻便的 运行式环境(Silverlight3的运行时环境4.3M,Silverlight4为6M),在如此小的运行环境下面有着B/S无法比拟的高级语言支 持,也就是说Silverlight具有一颗.Net的心脏—CoreCLR。

CoreCLR简单来说就是CLR for Silverlight,是专门为Silverlight量身打造的轻型CLR,用来执行Silverlight代码。Silverlight基于C#高 级语言,使用同样的托管机制与MSIL中间语言,CoreCLR自备编译环境、内存管理器,不依赖于外部环境。打造这个轻型“心脏”的过程并不容易,对于 轻型的RIA框架来说Silverlight运行时环境要考虑两大问题:大小与兼容性。

大小就是运行时环境的大小,从用户的角度来看,下载必须非常小。这就要求将功能集减至最少,目前 Silverlight4运行时环境大小为6M,CoreCLR中的DLL文件在CLR和WPF的类库中几乎都能找到,只不过大大裁剪了尺寸。这其中就包 括对基类库(BCL)的消减,.Net BCL中的很多功能在 Web 客户端上都没有任何意义,例如:由于 Silverlight 不支持 CAS,因此大部分 System.Security 都不是必要的,System.Console 等许多桌面类在 Web 中也没有任何意义。因此,CoreCLR删减了大量服务器端类库(如ADO.NET),去除非泛型集合类(如ArrayList,完全可以通过泛型集合类 代替),同时将复杂的桌面类也一并去除(如PLINQ和一些动态类),但保留了.NET Compact Framework 和 Silverlight 间的兼容性。

对于兼容性而言,从编程人员的角度来看,针对 CLR 的编码应该始终相同。因此,Silverlight堆栈底部的各个组件使用了与桌面CLR相同的代码,执行引擎和虚拟机都必须相同,这部件包括类型系统、 元数据、垃圾回收器 (GC)、JIT 编译器、线程池以及运行时引擎的其他核心部件。但为了适应 Web 应用程序,CoreCLR进行了一些更改,如富 Internet 应用程序通常简单且运行时间短,JIT 编译器主要侧重于减少启动时间,而非执行更复杂的优化操作,同样,服务器垃圾回收模式可以对使用相似分配模式的多个工作线程进行优化,而对 Web 托管应用程序则行不通,因此,Silverlight 只包含针对交互式应用程序进行优化的标准工作站 GC。

现在的.NET Framework里有一万个类,十万个方法,但CoreCLR中减少到了46个命名空间下不超过一千个类。

C#之父(同时也是Turbo Pascal与Delphi之父)Anders Hejlsberg认为未来编程语言的发展趋势及未来方向应该朝着框架与工具发展。笔者认为未来的语言发展方向不是朝着大而全的运行时框架方向发展,而是 朝着“轻框架、重工具组件”的方向发展。当我们使用Visual Studio开发应用程序时,我们首先选择的是“语言”,然后是“运行时框架”,再引入我们需要的“工具组件”。而精干的“运行时框架”与丰富的可选“工 具组件”将为企业应用提供更大的弹性、减轻程序大小、优化响应性能。

事实上,目前很多金融企业的核心应用已经在朝着“去客户化”、“去产品化”的小核心方向发展,“小核心”+“大外围”使企业内部核心具有更加持久的 生命力、更加灵活的扩展性和更快的反应能力。而企业应用展现层也越来越青睐于使用小而灵活的运行时环境,开发者完全可以根据实际需求挑选合适的工具组件, 提供更富弹性的展现层应用。Silverlight的未来应该更加关注适用性,而不应该过度考虑基本功能的强大,否则将发展成为另一个WPF,而失去自己 的方向。Silverlight4将Silverlight3的身躯加大了1.7M,加入了一些诸如集合接口ISet<T>、延迟初始化类 Lazy<T>、元组对象工厂类Tuple等复杂类型,加重了Silverlight内核。因此,在Silverlight5的Wish List中,笔者强烈要求Silverlight5关注解决跨设备的问题,而不要过度考虑加重基础类库的强大功能,加重Silverlight的包袱,使 原本轻便的Silverlight CoreCLR变得更加臃肿,无法起飞。

“对于未来,希望Silverlight仍能轻舞飞扬!”

注:部分内容取材于笔者即将发布的新书《-企业级RIA应用与Silverlight开发全流程实战》,敬请关注。

关于作者

吴磊,中国人寿IT高级技术主管、高级工程师,拥有7年企业级应用开发经验,负责过多个业务系统的开发工作。曾获得系统分析师、 PMP等认证,2003年开始接触RIA技术,并不遗余力的在企业应用中推广RIA技术, 2008年带领团队成功研发了国内首个Silverlight企业级应用—中国人寿养老金咨询系统 (PACS),该项目先后在 Silverlight3 发布会、Teched09 技术大会、QCON2010全球企业开发大会上作为成功案例进行展示。

[转载]SilverLight搭建WCF聊天室详细过程

mikel阅读(1168)

[转载]SilverLight搭建WCF聊天室详细过程 – 邪之灵 – 博客园.

后话:写了几篇文章后根据大家提的意见,我以后会尽量少贴代码,多帖流程图,并且以后会加上文字讲解流程图,前几篇有时间我会添加上流程图讲解,以及思路,让初学者更好理解,谢谢大家的支持!

SilverLight 4正式版发布给开发人员带来了更多功能,并且4已经支持NET.TCP协议,配合WCF开发高效率的交互应用程序已经不再是难事,本系列文章主要针对已经 完成的SilverLight聊天室分几部分为大家演示WCF双工服务调用。

项目主要使用SilverLight 4和WCF,开发环境VS2010,使用NET.TCP协议,主要实现了以下功能,先前版本源代码下载可以进群45656086,已经放到群共享里了,如 果此文章对各位朋友有帮助,请劳烦点个推荐或者留言,你们的支持才是我更新下去的动力,谢谢大家,我是营长,有问题大家可以提问:

1.多窗口聊天,窗口可拖动

2.用户分组动态显示

3.仿windows任务栏显示当前聊天用户

4.文本消息发送

5.发送图片,并且可放大

6.大文件,多文件同时发送

7.视频,语音并且可以保存

本系列随笔列表:

1.SilverLight搭建WCF聊天室详细过程(一)配置IIS

2.SilverLight搭建WCF聊天室详细过程(二)注册和登录

3.SilverLight搭建WCF聊天室详细过程(三)好友列表之 Accordion滑动分组动态绑定

4.SilverLight搭建WCF聊天室详细过程(四)好友上线

5.SilverLight搭建WCF聊天室详细过程(五)好友下线

6.SilverLight搭建WCF聊天室详细过程(六)打开聊天窗口

7.SilverLight搭建WCF聊天室详细过程(七)打开窗口后添加到任务栏

8.SilverLight搭建WCF聊天室详细过程(八)发送文本消息

9.SilverLight搭建WCF聊天室详细过程(九)接收文本消息

10.SilverLight搭建WCF聊天室详细过程(十)接收离线消息

11.SilverLight搭建WCF聊天室详细过程(十一)发送图片

12.SilverLight搭建WCF聊天室详细过程(十二)接收图片

13.SilverLight搭建WCF聊天室详细过程(十三)发送文件邀请

14.SilverLight搭建WCF聊天室详细过程(十四)发送文件

15.SilverLight搭建WCF聊天室详细过程(十五)接收文件

16.SilverLight搭建WCF聊天室详细过程(十六)仿QQ消息提醒

17.SilverLight搭建WCF聊天室详细过程(十七)新用户注册并刷新所有在线好友列表

18.SilverLight搭建WCF聊天室详细过程(十八)视频

19.SilverLight搭建WCF聊天室详细过程(十九)WCF服务端变量以及对象设计思路

未完待续..

[转载]轻松建立Silverlight开发环境

mikel阅读(943)

创建Silverlight 4开发环境,微软提供最简单的方法是使用Web Platform Installer,进行“一键安装”,

下载安装后,Web Platform Installer会自动检测哪些软件你已经安装

silverlightchina.net

silverlightchina.net
silverlightchina.net
如果需要安装新的Developer Tools,只需要选中该项目,下面“Install”按钮会提示安装下一步。
通常来说,Silverlight 4 的开发环境需要包含以下几个开发工具:
1. Visual Studio 2010或者Visual Web Developer 2010 Express ,在安装过程中,.Net Framework 4会同时被安装,另外,也可以单独下载.Net Framework 4安装;
2. 安装完开发工具后,需要下载安装Silverlight 4 Tools for Visual Studio 2010开发包。下载链接:Silverlight 4 Tools for Visual Studio 2010; 安装完成后,在Visual Studio 2010中将会自动更新添加Silverlight 4项目开发模板,以及Silverlight 4 SDK和相关开发环境. 以下是该开发包中包含的内容:

  • Silverlight 4 developer runtime
  • Silverlight 4 SDK (software development kit)
  • Update for Visual Studio 2010 and Visual Web Developer Express 2010 (KB982218)
  • Silverlight 4 Tools for Visual Studio 2010
  • WCF RIA Services V1.0 for Silverlight 4
  • F# Runtime for Silverlight 4

3. 针对Silverlight美工开发人员,需要下载Expression Studio 4,因为只有Blend 4支持Silverlight 4项目开发,另外Blend 4和Visual Studio 2010是无缝结合,使用Blend 4可以很轻松的创建和修改自定义控件样式,开发专业的Silverlight项目界面。
4. 最后推荐安装Silverlight 4 Toolkit控件包,该控件是微软开发的Silverlight控件扩展包.其中包含数十种扩展控件,可以方便Silverlight项目开发,另外该项目是开源项目,开发人员可以轻松的修改控件,创建自定义控件效果。
安装完成以上工具,Silverlight 4的开发环境已经创建完毕,如果是使用Web Platform Installer,可以选择以上相关选项进行一键安装,就可以开发Silverlight 4项目了。
另外微软已经推出Silverlight 4简体中文正式版脱机帮助文档,该文档包含Silverlight 4所有的技术知识,是开发人员必备资料,推荐下载。
Microsoft Silverlight 4 脱机文档 (简体中文)
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=b6127b9b-968c-46c2-8cb6-d228e017ad74

Microsoft Silverlight 4 在线帮助文档(MSDN)(简体中文)
http://msdn.microsoft.com/zh-cn/library/cc838158(vs.95).aspx

以下是基于Visual Studio 2008的Silverlight 3开发环境创建.

建立Silverlight 3开发环境分以下四个步骤:

1. 首先需要安装开发工具,对于Silverlight 3项目开发,必须使用 Visual Studio 2008 SP1 或者 Visual Web Developer Express with SP1 作为开发工具。在安装过程中,.Net Framework 3.5 sp1同时被安装,如果没有安装.Net Framwork 3.5 sp1需要独立下载安装。

2. 安装开发工具后,需要下载安装Silverlight工具开发包. 点击下载: Silverlight 2 Tools for Visual Studio 2008 SP1 或者 Silverlight 3 Tools for Visual Studio 2008 SP1, 完成Silverlight开发包安装后,Visual Studio 2008中将自动更新添加Silverlight项目开发模板,以及Silverlight SDK和相关开发环境.

3. 针对Silverlight 3项目,用户界面设计人员来讲,还需要安装Microsoft Expression Blend 3 . Blend是Expression配套软件,可以让界面设计人员很轻松的开发出专业的Silverlight用户界面.

4. 最后,需要下载Silverlight Toolkit. 该控件是微软开发的Silverlight控件扩展包.

完成以上安装后,即可进行Silverlight开发了.

请注意,Silverlight开发环境对于语言环境要求比较严格,在中文开发环境中,不能安装英文版本的Silverlight开发包。

最新Silverlight 3 英文开发包下载:  http://silverlightchina.net/html/download/books/2009/0710/56.html

最新Silverlight 3 中文开发包下载: http://silverlightchina.net/html/download/2009/0730/132.html

[转载]Silverlight MMORPG网页游戏开发课程(Game Lesson):目录

mikel阅读(948)

[转载]Silverlight MMORPG网页游戏开发课程(Game Lesson):目录 – 深蓝色右手 – 博客园.

一 次全新的开始,一次全新的构建与诠释。渴望在时空长廊中寻觅传说中光的起源,我决定用这部课程编写一首血脉喷张之进行曲。一年前,我一个人在战斗,前行, 引导我绝不放弃的是那遥远而飘渺的微米月光,循着光的足迹至今天,为这股越发坚定的力量所吸附更多的光无惧黑暗的吞噬,穿越,直至大地!何以扶平我此刻宽 慰的心?交织着英雄与自由主义那勇往直前之无尚银光。

有朋友认为这次的课程毫无新意,其实不然。如果你选择仔细阅读每个角落,或许你收获的东西比我第一部教程给 得更多且更实用。依旧是一节接一节循序渐进的模式推进着整个章节,对于有Silverlight基础的朋友可以说不存在任何难点。不要被“游戏开发”这几 个大字所吓到,既然你选择来到这个世界上,就一定要比前人活得更坚强且更有价值!理想的实现与每每朝着理想的方向迈出那么一小步都将成为你毕生的骄傲!或 许真该畏惧的是我,发自心底的害怕那些无法坚持,浮躁,热衷一步登天之徒。

整系列课程将分成两部份讲解,第一期主要实现Silverlight MMORPG的客户端部分主体功能;第二期则主要讲述Silverlight MMORPG服务器模块(通信编程)。

课程Demo在线演示地址:http://silverfuture.cn

另外,这是一份最初静态版的课程Demo源码同样提供给大家参考。

友情提示:本系列课程完全为本人原创,本人享有示例源码的所有权并与博客园共同享有该教程版权,请在本人许可的前提下进行相关使用,否则保留追究法律责任的权利。另外,课程中所有素材均来源于网络,切勿用作商业用途,否则后果自负

本系列课程目录如下:

[一 期]

Silverlight MMORPG网页游戏开发课程[一期] 序言

Silverlight MMORPG网页游戏开发课程[一期] 第一课:控制对象移动 [源码 1.1 1.2 1.3] [视频 1.1 1.2]

Silverlight MMORPG网页游戏开发课程[一期] 第二课:完美2D精灵 [源码 2.1 2.2]

Silverlight MMORPG网页游戏开发课程[一期] 第三课:封装游戏控件[源码 3.1 3.2]

Silverlight MMORPG网页游戏开发课程[一期] 第四课:资源布局之动静结合 [源码 4.1 4.2 4.3]

Silverlight MMORPG网页游戏开发课程[一期] 第五课:GPU硬件加速与OOB模式 [源码 5.1]

Silverlight MMORPG网页游戏开发课程[一期] 第六课:场景之地图与遮挡 [源码 6.1 6.2]

Silverlight MMORPG网页游戏开发课程[一期] 第七课:场景之地形与寻径 [源码 7.1 7.2 地图编辑器 场景编辑器]

Silverlight MMORPG网页游戏开发课程[一期] 第八课:场景之切换与动画效果 [源码 8.1]

Silverlight MMORPG网页游戏开发课程[一期] 第九课:HUD与背景音乐 [源码 9.1]

Silverlight MMORPG网页游戏开发课程[一期] 第十课:面向对象的重构 [源码 10.1]

Silverlight MMORPG网页游戏开发课程[一期] 第十一课:战斗系统之脚本与精灵捕获 [源码 11.1]

Silverlight MMORPG网页游戏开发课程[一期] 第十二课:战斗系统之普通攻击 [源码 12.1]

Silverlight MMORPG网页游戏开发课程[一期] 第十三课:战斗系统之技能/魔法攻击 [源码 13.1]

Silverlight MMORPG网页游戏开发课程[一期] 第十四课:完结篇 [源码 14.1]

[二 期]

放思绪先飞一会儿吧,敬请期待……

友情招聘:中游在线[北京]招聘Silverlight游戏开发者,盛情期待您的加入!

具体要求:

理解面向对象的编程思想、设计模式;

熟悉使用基于C#语言基础及常用库的开发;

熟练下述任一开发环境,Visual Studio,Microsoft Expression Studio;

对Silverlight开发非常有兴趣;

有责任心,学习、沟通和团队合作必不可少,能适应较强的工作压力;

简历附有作品或项目介绍,提供演示程序或截图;

待遇面议,用您的潜力见证您的价值!

联系方式:http://nxria.com/contact.html

[转载]ASP.NET MVC:创建 ModelBinder 自动 Trim 所有字符串

mikel阅读(997)

[转载]ASP.NET MVC:创建 ModelBinder 自动 Trim 所有字符串 – 鹤冲天 – 博客园.

用户输入的字符串前后的空格会对程序造成很大的危害,最常见的问题就是查询和统计错误。作为严谨的开发人员,我们应该主动进行处理。

逐个 Trim 相当麻烦

.NET 中为我们提供了三个字符串处理函数,相信大家一定都用过:Trim、TrimStart、TrimEnd。

但在实际应用中,逐个 Trim 是相当麻烦的。我们来分析下,请看如下 Controller 及其 Model:

public class PersonController : Controller
{
    public ActionResult Query(string name)
    {
        //...
    }
    //...
    [HttpPost]
    public ActionResult Create(Person person)
    {
        //...
    }
    [HttpPost]
    public ActionResult Create2(FormCollection collection) 
    { 
        Person person = new Person();
	UpdateModel(person, collection);
        //...
    }
    //...
}

public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
}

需要进行 Trim 的大致有以下三种:

  1. Action 中的字符串参数,如 Query 方法中的 name 参数。
  2. Action 中的复杂类型参数的字符串属性,如 Create 方法中的 person 的 Name 属性。
  3. Action 中显式绑定的复杂类型的字符串属性,如 Create2 方法中的 person 的 Name 属性。

如果 Model 更复杂:

public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string[] Hobbies { get; set; }
    public Person Father { get; set; }
}

还需要对 Hobbies 和 Father.Name 进行处理…

但在 MVC 中可以通过 ModelBinder 来轻松解决。

使用 ModelBinder 来解决 Trim 问题

使用 ModelBinder 来解决 Trim 问题,有 N 多种方式,本文介绍最简单的一种,只需要以下两步:

1. 创建一个有 Trim 功能的 ModelBinder(仅用于 string 类型):

public class StringTrimModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = base.BindModel(controllerContext, bindingContext);
        if (value is string) return (value as string).Trim();
        return value;
    }
}

简单吧,就三行代码(其实还可以再精简)。

2. 在 Global.asax 中为 string 类型指定这个 ModelBinder:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ModelBinders.Binders.Add(typeof(string), new StringTrimModelBinder());
        //...
    }
    //...
}

根据 MVC 的绑定机制,所有的字符串绑定都将会使用 StringTrimModelBinder。

也就是说,我们前面应用场景中提到的各种类型字符串都可以自动 Trim 了,包括 person.Name、 person.Hobbies 和 person.Father.Name。

OK!简单吧,这完全得益于 MVC 优秀的设计和架构。