基本原則
- Windows Mobile程式永遠不由使用者關閉,通過處理Activate和Deactive Event在前背景切換的時候處理使用的資源;通過處理Closing和Closed Event來處理被OS自行關閉的時候要處理的動作;通過設定MinimizeBox=true來将OK按鈕替換成X按鈕,點選X按鈕會造成系統最小化 (Deactive)而不是關閉;
- 通過Project Property->Common Propertiies->General->Application Icon來設定程式的關聯圖示;
常用控件
- Form Control
對PocketPC中的Form,FormBorderStyle.None會得到一個無邊框無TitleBar的視窗;FillBorderStyle.FixedSingle或其他值得到一個全屏化的視窗;
對WindowsCE 中的Form,FormBorderStyle.FixedDialog或FormBorderStyle.None會得到一個無邊框無TitleBar 的視窗;FillBorderStyle.FixedSingle或其他值得到一個按照預設的Size屬性設定大小的視窗;
Form的ControlBox屬性決定了最大/最小/X按鈕的可見性;對于PocketPC,ControlBox屬性最多包含一個按鈕;WindowsCE可以包含多個按鈕,單獨按鈕的可見性可以通過MinimizeBox和MaximizeBox屬性設定;
Form 的WindowsState屬性決定了視窗的初始視覺效果,隻能設定為FormWindowState.Normal或 FormWindowState.Maximized;對于PocketPC來說這兩個值都會造成程式充滿螢幕,但是Normal會顯示 StartMenu和MainMenu,Maximize則不顯示;
對于PocketPC,隻有FormBorderStyle.None的情況下Form的Size屬性和Location屬性才生效;對于WindowsCE則總是生效;
- Button Control(主要使用Click事件):
- TextBox Control支援BackColor、ForeColor、PasswordChar屬性,支援KeyPress、KeyUp、KeyDown事件 (Directional Pad的各個對應鍵值是Keys.Up,Keys.Down,Keys.Left,Keys.Right,Keys.Return;),不支援Click 事件;
- Label Control主要使用Text屬性,使用TextAlign屬性控制顯示的對齊方式,支援TextChanged事件;
- RadioButton Control位于同一個Container(例如Panel)中的時候被認為是同一組,當使用者點選RadioButton的時候觸發Click事件,當其選中狀态變化的時候觸發CheckedChanged事件;
- CheckBox Control主要使用CheckState屬性(Unchecked、Checked、Indeterminate);當CheckState= Indeterminate且ThreeState=true的時候,CheckBox變灰并選中,這時如果AutoCheck=false則 CheckBox不響應使用者點選、AutoCheck=true則使用者點選會enable這個控件;
- ComboBox Control/ListBox Control的清單既可以在設計的時候通過Items屬性修改,也可以在運作的時候通過Add/Remove/Clear方法修改—— comboBox1.Items.Add("Hi");ComboBox也可以綁定DataSource屬性到一個Collection object,預設情況下ComboxBox通過調用DataSource每個成員的ToString來生成要顯示的字元串,可以通過ComboBox的 DisplayName屬性來定制要顯示的屬性;ComboBox Control通過SelectedIndex/SelectedItem屬性來擷取選中的項目;
class Customer {
string m_First;
string m_Middle;
string m_Last;
public Customer(string first, string middle, string last) {
m_First = (first == null) ? string.Empty : first;
m_Middle = (middle == null) ? string.Empty : middle;
m_Last = (last == null) ? string.Empty : last;
}
public string FirstName {
get { return m_First; }
}
public string MiddleName {
get { return m_Middle; }
}
public string LastName {
get { return m_Last; }
}
static string FullNameWithInitial = "{0} {1}. {2}";
static string FullNameNoInitial = "{0} {1}";
public string FullName {
get {
return (m_Middle.Length > 0) ?
string.Format(FullNameWithInitial, m_First, m_Middle[0], m_Last) :
string.Format(FullNameNoInitial, m_First, m_Last);
}
}
}
private void LoadCustomers() {
if(customers != null)
return;
customers = new Customer[6];
customers[0] = new Customer("Ronnie", "Donnell", "Yates");
customers[1] = new Customer("Moya", "Alicia", "Hines");
customers[2] = new Customer("Veronica", "Christine", "Yates");
customers[3] = new Customer("Diane", "", "Taylor");
customers[4] = new Customer("Kindell", "Elisha", "Yates");
customers[5] = new Customer("Zion", "Donnell", "Yates");
this.comboBox1.DataSource = customers;
this.comboBox1.DisplayMember = "FullName";
}
...
string selItem = comboBox1.Items[comboBox1.SelectedIndex].ToString();
string selItem = comboBox1.SelectedItem.ToString();
...
- NumericUpDown Control隻能接受整數,有上下限,常用屬性為Minimum, Maximum, Value, Increment, ReadOnly, Text;如果使用者輸入的資料合法,Value==Text,否則Text=使用者輸入,Value=Maximum;支援ValueChanged事件 (隻在通過代碼或者上下箭頭改變Value的時候觸發,使用者輸入不觸發這個事件)
- DomainUpDown Control類似NumericUpDown control但是顯示的是一系列string而不是整數,主要使用Items和Text屬性;Items的操作方法類似ComboBox;支援 TextChanged和SelectedIndexChanged事件(SelectedIndexChanged隻在通過代碼或者上下箭頭改變的時候 觸發,使用者輸入不觸發這個事件);
- ProgressBar Control主要使用Minimum, Maximum, Value屬性;
- StatusBar Control隻能顯示字元串,主要使用Text屬性;
- TrackBar Control是一個滑動條,和ProgressBar類似,主要使用Minimum, Maximum, Value屬性;Orientation屬性控制滑動條的方向,TickFrequency屬性控制tick mark的距離,SmallChange和LargeChange分别是鍵盤和點選的步進量;主要使用ValueChanged事件;
- ToolBar Control不能顯示Text,使用ImageList Control來設定圖示;要使用ToolBar遵循如下步驟:
添加ImageList Control,通過Images屬性添加圖示,圖示會自動resize成16x16;
添加ToolBar Control,設定ImageList屬性;
通過Button屬性彈出的對話框添加按鈕,Button的Style屬性可以是DropDownButton、PushButton、Separator、ToggleButton
添加ButtonClick事件的handler,通過ToolBarButtonClickEventArgs.Button來判定哪個按鈕被點選
private void
toolBar1_ButtonClick(object sender,
System.Windows.Forms.ToolBarButtonClickEventArgs e) {
if(e.Button == this.toolBarButton1) {
OpenFileDialog dlg = new OpenFileDialog();
if(dlg.ShowDialog() == DialogResult.OK) {
this.lblOpenFile.Text = dlg.FileName;
}
}
else if(e.Button == this.toolBarButton2) {
SaveFileDialog dlg = new SaveFileDialog();
if(dlg.ShowDialog() == DialogResult.OK ) {
this.lblSaveFile.Text = dlg.FileName;
}
}
}
- MainMenu Control可以包含MenuItem Control,主要觸發Click事件;
MenuItem fileMenu = new MenuItem();
MenuItem newItem = new MenuItem();
MenuItem sepItem = new MenuItem();
MenuItem exitItem = new MenuItem();
fileMenu.Text = "File";
newItem.Text = "New";
sepItem.Text = "-";
exitItem.Text = "Exit";
fileMenu.MenuItems.Add(newItem);
fileMenu.MenuItems.Add(sepItem);
fileMenu.MenuItems.Add(exitItem);
mainMenu1.MenuItems.Add(fileMenu);
- ContextMenu Control和MainMenu幾乎一樣,但是MainMenu關聯于Form,ContextMenu關聯于其他Control;ContextMenu在顯示前會觸發Popup事件,在點選時會觸發CLick事件;
ContextMenu cMenu = new ContextMenu();
MenuItem menuItem1 = new MenuItem();
MenuItem menuItem2 = new MenuItem();
menuItem1.Text = "Default Item 1";
menuItem2.Text = "Default Item 2";
// Add menuItem2 as a child of menuItem1
menuItem1.MenuItems.Add(this.menuItem2);
// Add menuItem1 to the context menu
cMenu.MenuItems.Add(this.menuItem1);
// Add the context menu to a label control
label1.ContextMenu = cMenu;
......
private void contextMenu1_Popup(object sender, System.EventArgs e) {
this.contextMenu1.MenuItems.Clear();
if(this.checkBox1.Checked)
this.contextMenu1.MenuItems.Add(this.menuItem1);
if(this.checkBox2.Checked)
this.contextMenu1.MenuItems.Add(this.menuItem2);
if(this.checkBox3.Checked)
this.contextMenu1.MenuItems.Add(this.menuItem3);
// Always add the default menu
this.contextMenu1.MenuItems.Add(this.menuItem4);
}
private void menuItem1_Click(object sender, System.EventArgs e) {
MessageBox.Show("You selected MenuItem 1");
}
......
- Timer Control允許你周期性觸發事件,event handler在視窗代碼的同一個Thread内運作;當Timer的Enabled=true的時候,每經過Interval指定的毫秒數,就觸發Tick事件;
- OpenFileDialog 和SaveFileDialog Control,使用Filter屬性設定顯示的檔案類型,可以通過改變FilterIndex屬性(從1開始)來選擇file filter;使用InitalDirectory屬性來設定起始目錄;通過ShowDialog方法來顯示對話框;通過Filename屬性傳回選中的 檔案名;
OpenFileDialog ofDlg = new OpenFileDialog();
ofDlg.Filter = "DLL|*.dll|Executable|*.exe";
ofDlg.IntialDirectory = "//My Documents";
if(DialogResult.OK == ofDlg.ShowDialog()) {
MessageBox.Show("You Selected " + ofDlg.FileName);
} else {
MessageBox.Show("Go ahead, select a file!");
}
- Panel Control是其他控件的容器,主要使用Add方法;
- HScrollBar 和VScrollBar Control,主要使用Minimum、Maximum(實際最邊上的值是Maximum-LargeChange+1)、SmallChange、 LargeChange、Value;Value屬性改變的時候會觸發ValueChanged事件;
- ImageList Control中如果你想要16x16以外的大小,使用ImageSize屬性;主要使用Images屬性及其Add方法(支援System.Drawing.Icon和System.Drawing.Image);
- PictureBox Control用于顯示圖像,主要使用Image屬性,但是隻能在左上角顯示且沒有拉伸功能;Image可以從file system獲得,也可以從resource獲得,還可以從ImageList得到;
// resize the image
imageList1.ImageSize = new System.Drawing.Size(92, 156);
// load the resized image
pictureBox1.Image = imageList1.Images[0];
- ListView Control支援4中顯示模式Details, LargeIcon, List, SmallIcon,通過View屬性類設定;通過操作Columns來控制Details模式下的SubItems,既可以在設計的時候通過 Columns屬性來設定,也可以在運作的時候生成;
System.Windows.Forms.ColumnHeader columnHeader1 = new ColumnHeader();
System.Windows.Forms.ColumnHeader columnHeader2 = new ColumnHeader();
System.Windows.Forms.ColumnHeader columnHeader3 = new ColumnHeader();
columnHeader1.Text = "Name";
columnHeader2.Text = "Purpose";
columnHeader3.Text = "Availability";
listView1.Columns.Add(columnHeader1);
listView1.Columns.Add(columnHeader2);
listView1.Columns.Add(columnHeader3);
ListView Control中的每一行都是一個ListViewItem,每個ListViewItem包含ListViewSubItem(通過SubItems屬 性操作,數量=columns-1);ListView可以關聯兩個ImageList,SmallImageList和LargeImageList, 每個ListViewItem包含ImageIndex屬性表示關聯的圖示;
ListViewItem listViewItem1 = new ListViewItem();
ListViewSubItem listViewSubItem1 = new ListViewSubItem();
ListViewSubItem listViewSubItem2 = new ListViewSubItem();
listViewItem1.Text = "Red Delicious";
listViewSubItem1.Text = "Snacking";
listViewSubItem2.Text = "All Year";
listViewItem1.SubItems.Add(listViewSubItem1);
listViewItem1.SubItems.Add(listViewSubItem2);
listView1.Items.Add(listViewItem1);
ListView Control的SelectedIndex變化的時候觸發SelectedIndexChanged事件(每次改變選擇實際上會觸發兩次事件,第一次表示前一個選擇失效,第二次表示新選擇);
private void listView1_SelectedIndexChanged(object sender,
System.EventArgs e) {
if(this.listView1.SelectedIndices.Count <= 0)
return;
int selNdx = this.listView1.SelectedIndices[0];
label3.Text = listView1.Items[selNdx].Text;
}
ListView Control還有幾個重要屬性CheckBoxes(改變CheckState的時候觸發ItemCheck)、FullRowSelect、 HeaderStyle(Clickable會觸發ColumnClick事件,Nonclickable不觸發事件,None不顯示column header);
- TabControl Control包含多個TabPage,可以通過TabPages屬性操作;包含SelectIndex屬性表示選擇的TabPage,在改變的時候觸發SelectedIndexChanged事件;
- TreeView Control具有Nodes屬性,包含一系列TreeNode,每個TreeNode也包含Nodes屬性;TreeView具有ImageList、 ImageIndex(可以通過TreeNode.ImageIndex對父層的設定進行Override)、SelectedImageIndex(可 以通過TreeNode.SelectedImageIndex對父層的設定進行Override)、ShowPlusMinus、ShowLines (在TreeNode間畫線)、ShowRootLines(是否在TreeNode和Root之間畫線)、CheckBoxes(對應的狀态屬性為 Checked,check node的操作會觸發AfterCheck事件);TreeNode具有Text、ImageIndex、SelectedImageIndex屬性;
TreeNode treeNode1 = new TreeNode();
TreeNode treeNode2 = new TreeNode();
treeNode1.Text = "Red Apples";
treeNode2.Text = "Red Delicious";
treeNode1.Nodes.Add(treeNode2);
treeView1.Nodes.Add(treeNode1);
TreeView Control具有SelectedNode屬性,引用目前被選中的TreeNode,選中TreeNode會觸發AfterSelect事件, TreeViewEventArgs包含了Node和Action(表示觸發事件的原因:ByKeyboard、ByMouse、Collapse、 Expand、Unknown)屬性
private void
treeView1_AfterSelect(object sender,
System.Windows.Forms.TreeViewEventArgs e) {
TreeNode selNode = e.Node;
label2.Text = selNode.Text;
}