Windows 8 Metro開發疑難雜症(五)——DataGrid控制項

來源:互聯網
上載者:User

 

關於DataGrid控制項做過Silverlight開發的一定會很熟悉,可是在win8 的SDK裡面沒有這樣的控制項的,只能自訂,而DataGrid控制項是開發公司專屬應用程式必須的控制項,公司專屬應用程式大多是以表格形式來展示資料的。先讓各位看下最終。

DataGrid控制項擁有表格式資料展示,單行資料詳情展示,儲存格編輯等功能。

DataGrid控制項的源碼我不作多解釋,直接看我的源碼就行。

做過web開發的應該對這種表格類的控制項很熟悉的,有行和列,每一行對應資料來源中的一條資料,每一個儲存格對應一條資料的一個屬性,每個單元可以編輯,在DataGrid中是雙擊儲存格編輯。

下面我主要講下如何使用這個DataGrid控制項。

DataGrid控制項中有一個Columns屬性,這是一個集合,這個屬性是定義表格列樣式的,內容是DataGridTemplateColumn,裡面可以定義表格欄位標題,欄位標題樣式,列儲存格模板,列儲存格編輯狀態模板。

 <gControls:DataGrid Grid.Row="1" x:Name="list">            <gControls:DataGrid.Columns>                <gControls:DataGridTemplateColumn Header="訂單號" Width="200">                    <gControls:DataGridTemplateColumn.CellTemplate>                        <DataTemplate>                            <Grid>                                <TextBlock Text="{Binding OrderId}" Style="{StaticResource TextBlockStyle}"/>                            </Grid>                        </DataTemplate>                    </gControls:DataGridTemplateColumn.CellTemplate>                </gControls:DataGridTemplateColumn>                <gControls:DataGridTemplateColumn Header="需支付金額" Width="400">                    <gControls:DataGridTemplateColumn.CellTemplate>                        <DataTemplate>                            <Grid>                                <TextBlock Text="{Binding TotalPrice}" Style="{StaticResource TextBlockStyle}"/>                            </Grid>                        </DataTemplate>                    </gControls:DataGridTemplateColumn.CellTemplate>                </gControls:DataGridTemplateColumn>                <gControls:DataGridTemplateColumn Header="發貨庫房(可編輯)">                    <gControls:DataGridTemplateColumn.CellTemplate>                        <DataTemplate>                            <Grid>                                <TextBlock Text="{Binding StoreHouse}" Style="{StaticResource TextBlockStyle}"/>                            </Grid>                        </DataTemplate>                    </gControls:DataGridTemplateColumn.CellTemplate>                    <gControls:DataGridTemplateColumn.CellEditingTemplate>                        <DataTemplate>                            <Grid>                                <TextBox Text="{Binding StoreHouse,Mode=TwoWay}"  KeyUp="TextBox_KeyUp"/>                            </Grid>                        </DataTemplate>                    </gControls:DataGridTemplateColumn.CellEditingTemplate>                </gControls:DataGridTemplateColumn>                <gControls:DataGridTemplateColumn Header="預計配送時間">                    <gControls:DataGridTemplateColumn.CellTemplate>                        <DataTemplate>                            <TextBlock Text="{Binding Max}" Style="{StaticResource TextBlockStyle}"/>                        </DataTemplate>                    </gControls:DataGridTemplateColumn.CellTemplate>                </gControls:DataGridTemplateColumn>                <gControls:DataGridTemplateColumn Header="刪除">                    <gControls:DataGridTemplateColumn.CellTemplate>                        <DataTemplate>                            <Button Content="刪除"  HorizontalAlignment="Stretch" Click="btnDeleteClick"/>                        </DataTemplate>                    </gControls:DataGridTemplateColumn.CellTemplate>                </gControls:DataGridTemplateColumn>            </gControls:DataGrid.Columns>            <gControls:DataGrid.RowDetailsTemplate>                <DataTemplate>                    <Grid>                        <TextBlock Text="{Binding Desciption}" TextWrapping="Wrap" FontSize="25"/>                    </Grid>                </DataTemplate>            </gControls:DataGrid.RowDetailsTemplate>        </gControls:DataGrid>

以上代碼定義了每列的樣式,其中第三列是可編輯的(雙擊儲存格進入編輯模式),第五列是用來刪除行的,因為DataGrid是繼承自ListView的,所以添加和刪除資料都是有動畫的。RowDetailsTemplate是定義資料詳情展示的模板的。

後台代碼就兩個,一個btnDeleteClick,用來刪除行的,一個是TextBox_KeyUp事件,用來當儲存格進入編輯模式,使用者在按下斷行符號鍵的時候離開編輯模式進入閱讀模式。

現在啟動並執行介面

有人可能想要實現web上表單的奇偶行背景不一樣的功能,其實這樣的功能是很簡單的,不管你是奇偶行不同,還是三行,四行,五行不通,原理是一樣的,就是在DataGrid在載入資料的時候根據每條資料確定該資料處於是奇數行還是偶數行來動態給背景。

這裡我不準備修改DataGrid代碼,重新定義一個控制項就叫DataGrid1,添加如下代碼:

public  class DataGrid1:Controls.DataGrid    {      protected override void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item)      {          Control f = element as Control;          if (f != null)          {              var index = this.ItemContainerGenerator.IndexFromContainer(element) %3;              if (index == 0)              {                  f.Background = new SolidColorBrush(Colors.AliceBlue);              }              else if (index == 1)              {                  f.Background = new SolidColorBrush(Colors.Beige);              }              else if (index == 2)              {                  f.Background = new SolidColorBrush(Colors.LightSteelBlue);              }          }          base.PrepareContainerForItemOverride(element, item);      }    }

然後用DataGrid1這個控制項替換原來的XAML中使用的DataGrid控制項,這樣就實現了我們需要的每三行背景顏色不同的功能。
通過更改樣式,甚至可以實現每列擁有不同背景的功能。

源碼下載

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.