乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      【W(wǎng)PF學(xué)習(xí)】第二十三章 列表控件

       新進(jìn)小設(shè)計(jì) 2020-04-20

        WPF提供了許多封裝項(xiàng)的集合的控件,本章介紹簡(jiǎn)單的ListBox和ComboBox控件,后續(xù)哈會(huì)介紹更特殊的控件,如ListView、TreeView和ToolBar控件。所有這些控件都繼承自ItemsControl類(ItemsControl類本身又繼承自Control類)。

        ItemsControl類添加了所有基于列表的控件都使用的基本功能。最顯著的是,它提供了填充列表項(xiàng)的兩種方式。最直接的方法是代碼或XAML將列表項(xiàng)直接添加到Items集合中。然而,在WPF中使用數(shù)據(jù)綁定的方法更普遍。使用數(shù)據(jù)綁定方法,需將ItemsSource屬性設(shè)置為希望顯示的具有數(shù)據(jù)項(xiàng)集合的對(duì)象(后續(xù)章節(jié)介紹與列表數(shù)據(jù)綁定相關(guān)的更多內(nèi)容)。

        ItemsControl類之后的繼承橙子有些混亂。一個(gè)主要分支是選擇器(selector),包括ListBox、ComboBox以及TabControl。這些控件都繼承自Selector類,并且都具有跟蹤當(dāng)前選擇項(xiàng)(SelectedItem)或其位置(SelectedIndex)的屬性,封裝列表項(xiàng)的控件是另一個(gè)分支,以不同方式選擇列表項(xiàng)。該分支包括用于菜單、工具欄以及樹的類——所有這些類都屬于ItemsControl,但不是選擇器。

        為了充分發(fā)揮所有ItemsControl控件的功能,需要使用數(shù)據(jù)綁定。即使不從數(shù)據(jù)庫甚至外部數(shù)據(jù)源獲取數(shù)據(jù),也同樣如此。WPF數(shù)據(jù)綁定非常普遍,可使用各種數(shù)據(jù),包括自定義的數(shù)據(jù)對(duì)象和集合。但現(xiàn)在還不需要考慮數(shù)據(jù)綁定的細(xì)節(jié)?,F(xiàn)在,先快速瀏覽一下ListBox控件和ComboBox控件。

      一、ListBox

        ListBox類代表了一種最常用的Windows設(shè)計(jì)——允許用戶從長度可變的列表中選擇一項(xiàng)。

        如果將SelectionMode屬性設(shè)置為Multiple或Extended,ListBox類還允許選擇多項(xiàng)。在Multiple模式下,可通過單擊項(xiàng)進(jìn)行選擇或取消選擇。在Extended模式下,需要按下Ctrl鍵選擇其他項(xiàng),或按下Shift鍵選擇某個(gè)選項(xiàng)范圍。在這兩種多選模式下,可用SelectedItems集合替代SelectedItem屬性來獲取所有選擇的項(xiàng)。

        為向ListBox控件中添加項(xiàng),可在ListBox元素中嵌套ListBoxItem元素。例如,下面是一個(gè)包含顏色列表的ListBox:

      <ListBox>
           <ListBoxItem>Yellow</ListBoxItem>
           <ListBoxItem>Blue</ListBoxItem>
           <ListBoxItem>Green</ListBoxItem>
           <ListBoxItem>Red</ListBoxItem>
           <ListBoxItem>LightBlue</ListBoxItem>
           <ListBoxItem>Black</ListBoxItem>
      </ListBox>

        不同控件采用不同方式處理嵌套的內(nèi)容。ListBox控件在它的Items集合中存儲(chǔ)每個(gè)嵌套的對(duì)象。

        ListBox控件是一個(gè)非常靈活的控件。它不僅可以包含ListBoxItem對(duì)象,也可以駐留其他任意元素。這是因?yàn)長istBoxItem類繼承自ContentControl類,從而ListBoxItem能夠包含一段嵌套的內(nèi)容。如果該內(nèi)容繼承自UIElement類,它將ListBox控件中呈現(xiàn)出來。如果是其他類型的對(duì)象,ListBoxItem對(duì)象會(huì)調(diào)用ToString()方法并顯示最終的文本。

        例如,如果決定創(chuàng)建一個(gè)包含圖像的列表,可使用如下標(biāo)記:

      <ListBox>
              <ListBoxItem>
                  <Image Source="happyface.jpg"></Image>
              </ListBoxItem>
              <ListBoxItem>
                  <Image Source="redx.jpg"></Image>
              </ListBoxItem>
      </ListBox>

        實(shí)際上ListBox控件足夠職能,它能隱式地創(chuàng)建所需的ListBoxItem對(duì)象。這意味著可直接在ListBox元素中放置對(duì)象。廈門市一個(gè)更復(fù)雜的示例,該示例使用嵌套的StackPanel對(duì)象組合文本和圖像內(nèi)容:

      <Window x:Class="Controls.ImageList"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              Title="ImageList" Height="300" Width="300">
          <ListBox Margin="5" SelectionMode="Multiple" Name="lst" SelectionChanged="lst_SelectionChanged">
              <StackPanel Orientation="Horizontal">
                  <Image Source="happyface.jpg" Width="30" Height="30"></Image>
                  <Label VerticalAlignment="Center">A Happy face</Label>
              </StackPanel>
              <StackPanel Orientation="Horizontal">
                  <Image Source="redx.jpg" Width="30" Height="30"></Image>
                  <Label VerticalAlignment="Center">A Warning face</Label>
              </StackPanel>
              <StackPanel Orientation="Horizontal">
                  <Image Source="happyface.jpg" Width="30" Height="30"></Image>
                  <Label VerticalAlignment="Center">A Happy face</Label>
              </StackPanel>
          </ListBox>
      </Window>
      ImageListBox

        在該例中,StackPanel面板變成被ListBoxItem封裝的項(xiàng)。該標(biāo)記創(chuàng)建的富列表如圖下圖所示:

       

         利用在列表框中的嵌套任意元素的能力,可創(chuàng)建出各種基于列表的控件,而不必使用其他類。例如,Windows窗體的哦該凝聚項(xiàng)中CheckedListBox類,該類顯示在每個(gè)項(xiàng)的旁邊都具有復(fù)選框的列表。在WPF中不需要這一特殊類,因?yàn)橥耆墒褂脴?biāo)準(zhǔn)的ListBox控件快速構(gòu)建相同的效果:

      <Window x:Class="Controls.CheckBoxList"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              Title="CheckBoxList" Height="300" Width="300">
          <Grid Margin="10">
              <Grid.RowDefinitions>
                  <RowDefinition Height="*"></RowDefinition>
                  <RowDefinition Height="Auto"></RowDefinition>
              </Grid.RowDefinitions>
      
              <ListBox Name="lst" SelectionChanged="lst_SelectionChanged"
                   CheckBox.Click="lst_SelectionChanged" >
                  <CheckBox Margin="3">Option 1</CheckBox>
                  <CheckBox Margin="3">Option 2</CheckBox>
                  <CheckBox Margin="3">Option 3</CheckBox>
              </ListBox>
              <StackPanel Grid.Row="1" Margin="0,10,0,0">
                  <TextBlock>Current selection:</TextBlock>
                  <TextBlock  Name="txtSelection" TextWrapping="Wrap"></TextBlock>
                  <Button Margin="0,10,0,0" Click="cmd_CheckAllItems">Examine All Items</Button>
              </StackPanel>
          </Grid>
      </Window>
      CheckBoxList

        當(dāng)在列表內(nèi)部使用不同元素時(shí)需要注意一點(diǎn)。當(dāng)讀取SelectedItem值時(shí)(以及SelectedItems和Items集合),看不到ListBoxItem對(duì)象——反而將看到放入到列表中的對(duì)象。在CheckedListBox示例中,這意味著SelectedItem提供了CheckBox對(duì)象。

        例如,下面是一些響應(yīng)SelectionChanged事件觸發(fā)的代碼。這些代碼獲取當(dāng)天選中CheckBox對(duì)象并顯示該項(xiàng)是否被選中:

      private void lst_SelectionChanged(object sender, RoutedEventArgs e)
              {
                  // Select when checkbox portion is clicked (optional).
                  if (e.OriginalSource is CheckBox)
                  {
                      lst.SelectedItem = e.OriginalSource;
                  }
      
                  if (lst.SelectedItem == null) return;
                  txtSelection.Text = String.Format(
                      "You chose item at position {0}.\r\nChecked state is {1}.",
                      lst.SelectedIndex,
                      ((CheckBox)lst.SelectedItem).IsChecked);
              }

        在下面的代碼片段中,類似的代碼遍歷選項(xiàng)集合以確定哪一項(xiàng)被選中(對(duì)于使用復(fù)選框的多項(xiàng)選擇列表,可以編寫類似的代碼來遍歷選中項(xiàng)的集合)。

      private void cmd_CheckAllItems(object sender, RoutedEventArgs e)
              {
                  StringBuilder sb = new StringBuilder();
                  foreach (CheckBox item in lst.Items)
                  {
                      if (item.IsChecked == true)
                      {
                          sb.Append(
                              item.Content + " is checked.");
                          sb.Append("\r\n");
                      }
                  }
                  txtSelection.Text = sb.ToString();
              }

        最終效果如下所示:

       

         在列表框中手動(dòng)放置項(xiàng)時(shí),由你決定是希望直接插入項(xiàng)還是在ListBoxItem對(duì)象中明確地包含每項(xiàng)。第二種方法通常更清晰,也更繁瑣。最重要的考慮事項(xiàng)是一致性。例如,如果在列表中放置StackPanel對(duì)象,ListBox.SelectedItem對(duì)象將是StackPanel。如果放置由ListBoxItem對(duì)象封裝的StackPanel對(duì)象,ListBox.SelectedItem對(duì)象將是ListBoxItem,所以可進(jìn)行響應(yīng)編碼。

        ListBoxItem提供了少許額外功能,通過這些功能可得到直接嵌套的對(duì)象。換言之,ListBoxItem定義了可以讀取(或設(shè)置)的IsSelected屬性,以及用于通知何時(shí)選中的Selected和Unselected事件。然而,可使用ListBox類的成員得到類似功能,如SelectedItem屬性(或SelectedItems屬性)以及SelectionChanged事件。

        有趣的是,當(dāng)使用嵌套對(duì)象方法時(shí),有一項(xiàng)技術(shù)可為特定的對(duì)象檢索ListBoxItem封裝器。技巧是使用常被忽視的ContainerFromElement()方法。下面的代碼使用該技術(shù)檢查列表中的第一個(gè)條目是否被選中:

      ListBoxItem item=(ListBoxItem)lst.ContainerFromElement((DependencyObject)lst.SelectedItems[0]);
      MessageBox.Show("IsSelected:"+item.IsSelected.ToString());

      二、ComboBox

        ComboBox控件和ListBox控件類似。該控件包含ComboBoxItem對(duì)象的集合,既可以顯示地也可以隱式地創(chuàng)建該集合。與ListBoxItem類似,ComboBoxItem也是可以包含任意嵌套元素的內(nèi)容控件。

        ComboBox類和ListBox類之間的重要區(qū)別是他們?cè)诖翱谥谐尸F(xiàn)自身的方式。Combox控件使用下拉列表,這意味著一次只能選擇一項(xiàng)。

        如果希望允許用戶在組合框中通過輸入文本選項(xiàng)一項(xiàng),就必須將IsEditable屬性設(shè)置為true,并且必須確保選項(xiàng)集合中存儲(chǔ)的是普遍的純文本的ComboBoxItem對(duì)象,或是提供了有意義的ToString()表示的對(duì)象。例如,如果使用Image對(duì)象填充可編輯的組合框,那么在上面顯示的文本將只有Image類的全名,這用處不大。

        ComboBox控件的局限之一在于當(dāng)使用自動(dòng)改變尺寸功能時(shí)該控件改變自身尺寸的方法。ComboBox控件加寬自身以適應(yīng)它的內(nèi)容,這意味著當(dāng)從一項(xiàng)移到另一項(xiàng)是它會(huì)改變自身大小。但沒有簡(jiǎn)便的方法告訴ComboBox控件使用包含項(xiàng)的最大尺寸。相反,需要為Width屬性提供硬編碼的值,而這并不理想。

      下面是一個(gè)簡(jiǎn)單的示例:

      <Window x:Class="Controls.ComboBoxTest"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              Title="ComboBoxTest" Height="300" Width="300">
          <StackPanel>
              <ComboBox Margin="5">
                  <StackPanel Orientation="Horizontal">
                      <Image Source="happyface.jpg" Width="30" Height="30"></Image>
                      <Label VerticalAlignment="Center">A Happy face</Label>
                  </StackPanel>
                  <StackPanel Orientation="Horizontal">
                      <Image Source="redx.jpg" Width="30" Height="30"></Image>
                      <Label VerticalAlignment="Center">A Warning face</Label>
                  </StackPanel>
                  <StackPanel Orientation="Horizontal">
                      <Image Source="happyface.jpg" Width="30" Height="30"></Image>
                      <Label VerticalAlignment="Center">A Happy face</Label>
                  </StackPanel>
              </ComboBox>
          </StackPanel>
      </Window>
      ComboBoxTest

        最終效果圖如下所示:

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多