天天看點

.Net Compact Framework開發(1)——基本原則和常用控件

基本原則

  • 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;

    }