稳扎稳打Silverlight(36) - 3.0控件之TreeView, ListBox增强, DataGrid增强, MediaElement增强

简介:


索引页]

[源码下载]


稳扎稳打Silverlight(36) - 3.0控件之TreeView, ListBox增强, DataGrid增强, MediaElement增强


作者: webabcd


介绍
Silverlight 3.0 控件一览:
  • TreeView - 树控件
  • ListBox - 改进:支持多选
  • DataGrid - 改进:结合 PagedCollectionView 实现数据分组, 增加了一些编辑数据的相关事件, 结合 DataAnnotations 实现数据验证, 等。。。
  • MediaElement - 增加了对视频 H.264 编码格式的支持,和对音频 AAC 编码格式的支持 


在线DEMO
http://webabcd.blog.51cto.com/1787395/342289


示例
1、演示 TreeView 的使用
TreeView.xml(数据源)
<? xml  version ="1.0"  encoding ="utf-8"  ?> 
< root > 
         < node  name ="a level 1" > 
                 < node  name ="a level 2" > 
                         < node  name ="a level 3" > 
                                 < node  name ="a level 4"  /> 
                         </ node > 
                 </ node > 
         </ node > 
         < node  name ="b level 1" > 
                 < node  name ="b level 2" > 
                         < node  name ="b level 3" > 
                                 < node  name ="b level 4" > 
                                         < node  name ="b level 5"  /> 
                                 </ node > 
                         </ node > 
                 </ node > 
         </ node > 
         < node  name ="c level 1" > 
                 < node  name ="c level 2" > 
                         < node  name ="c level 3" > 
                                 < node  name ="c level 4"  /> 
                         </ node > 
                 </ node > 
         </ node > 
         < node  name ="d level 1" > 
                 < node  name ="d level 2" > 
                         < node  name ="d level 3"  /> 
                 </ node > 
         </ node > 
</ root >
 
TreeView.xaml
<navigation:Page x:Class="Silverlight30.Control.TreeView"    
                     xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"     
                     xmlns:common="clr-namespace:System.Windows;assembly=System.Windows.Controls" 
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                     mc:Ignorable="d" 
                     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
                     d:DesignWidth="640" d:DesignHeight="480" 
                     Title="TreeView Page"> 
        <Grid x:Name="LayoutRoot"> 
                <StackPanel> 

                        <StackPanel.Resources> 
                         
                                <!-- 
                                        HierarchicalDataTemplate - 呈现层级数据的数据模板 
                                                ItemsSource - 指定下一级数据的数据源 
                                                ItemTemplate - 指定下一级数据的数据模板 
                                --> 
                                <common:HierarchicalDataTemplate x:Key="childTemplate"    
                                        ItemsSource="{Binding Path=Children}"> 
                                        <StackPanel Orientation="Horizontal"> 
                                                <CheckBox /> 
                                                <TextBlock Text="{Binding Path=Title}" FontStyle="Italic" /> 
                                        </StackPanel> 
                                </common:HierarchicalDataTemplate> 
                                <common:HierarchicalDataTemplate x:Key="treeTemplate"    
                                        ItemsSource="{Binding Path=Children}"    
                                        ItemTemplate="{StaticResource childTemplate}"> 
                                        <TextBlock Text="{Binding Path=Title}" FontWeight="Bold" /> 
                                </common:HierarchicalDataTemplate> 
                                 
                        </StackPanel.Resources> 
                         
                         
                        <!-- 
                                ItemsSource - 数据源 
                                ItemTemplate - 指定层级显示数据的模板 
                        --> 
                        <controls:TreeView x:Name="treeView" Margin="5" 
                                ItemsSource="{Binding}"    
                                ItemTemplate="{StaticResource treeTemplate}" 
                                SelectedItemChanged="treeView_SelectedItemChanged"> 
                        </controls:TreeView> 
                         
                         
                        <!-- 
                                TreeViewItem - TreeView 的项 
                                        Header - 项的标题 
                                        HeaderTemplate - 项的标题模板 
                        --> 
                        <controls:TreeView x:Name="treeView2" Margin="5"> 
                                <controls:TreeViewItem Header="level 1"> 
                                        <controls:TreeViewItem Header="level 2"> 
                                                <controls:TreeViewItem> 
                                                        <controls:TreeViewItem.HeaderTemplate> 
                                                                <DataTemplate> 
                                                                        <TextBlock Text="level 3" FontWeight="Bold" /> 
                                                                </DataTemplate> 
                                                        </controls:TreeViewItem.HeaderTemplate> 
                                                </controls:TreeViewItem> 
                                        </controls:TreeViewItem> 
                                </controls:TreeViewItem> 
                        </controls:TreeView>                         
                         
                </StackPanel> 
        </Grid> 
</navigation:Page>
 
TreeView.xaml.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.Windows.Navigation; 
 
using System.Xml.Linq; 
using Silverlight30.Model; 
 
namespace Silverlight30.Control 

         public partial  class TreeView : Page 
        { 
                 public TreeView() 
                { 
                        InitializeComponent(); 
 
                         this.Loaded +=  new RoutedEventHandler(TreeView_Loaded); 
                } 
 
                 void TreeView_Loaded( object sender, RoutedEventArgs e) 
                { 
                        XElement root = XElement.Load( "Control/TreeView.xml"); 
 
                         // 构造带层级关系的数据源(递归方式) 
                        var result = LoadData(root); 
 
                        treeView.DataContext = result; 
                } 
 
                 private List<TreeViewModel> LoadData(XElement root) 
                { 
                         if (root ==  null
                                 return  null
 
                        var items = from n  in root.Elements( "node"
                                                select  new TreeViewModel 
                                                { 
                                                        Title = ( string)n.Attribute( "name"), 
                                                        Children = LoadData(n) 
                                                }; 
 
                         return items.ToList(); 
                } 
 
                 private  void treeView_SelectedItemChanged( object sender, RoutedPropertyChangedEventArgs< object> e) 
                { 
                        MessageBox.Show(((TreeViewModel)e.NewValue).Title); 
                } 
        } 
}
 
 
2、演示 ListBox 增加的一个功能:多选
ListBox.xaml
<navigation:Page x:Class="Silverlight30.Control.ListBox"    
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                     mc:Ignorable="d" 
                     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
                     d:DesignWidth="640" d:DesignHeight="480" 
                     Title="ListBox Page"> 
        <Grid x:Name="LayoutRoot"> 
                <StackPanel> 
                 
                        <!-- 
                                ListBox - 新增特性:可以多选 
                                SelectionMode - 选择模式 [System.Windows.Controls.SelectionMode 枚举] 
                                        Single - 只允许单选 
                                        Multiple - 可以多选(不需要任何辅助键) 
                                        Extended - 可以多选(需要 Ctrl 或 Shift 的配合) 
                        --> 
                        <ListBox x:Name="listBox" Margin="5" Width="200" Height="100" SelectionMode="Extended"> 
                                <ListBox.ItemTemplate> 
                                        <DataTemplate> 
                                                <StackPanel Orientation="Horizontal"> 
                                                        <TextBlock Text="{Binding}" Margin="5" /> 
                                                </StackPanel> 
                                        </DataTemplate> 
                                </ListBox.ItemTemplate> 
                        </ListBox> 
                         
                        <Button Content="获取选中项" Click="Button_Click" /> 
                        <TextBlock x:Name="lblResult" /> 
                         
                </StackPanel> 
        </Grid> 
</navigation:Page>
 
ListBox.xaml.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.Windows.Navigation; 
 
namespace Silverlight30.Control 

         public partial  class ListBox : Page 
        { 
                 public ListBox() 
                { 
                        InitializeComponent(); 
 
                         this.Loaded +=  new RoutedEventHandler(ListBox_Loaded); 
                } 
 
                 void ListBox_Loaded( object sender, RoutedEventArgs e) 
                { 
                        List< string> items =  new List< string>(); 
                         for ( int i = 0; i < 30; i++) 
                        { 
                                items.Add(i.ToString().PadLeft(10, '0')); 
                        } 
 
                        listBox.ItemsSource = items; 
                } 
 
                 private  void Button_Click( object sender, RoutedEventArgs e) 
                { 
                        lblResult.Text = ""; 
                         // ListBox.SelectedItems - 选中的对象集合 
                         foreach ( string s  in listBox.SelectedItems) 
                        { 
                                lblResult.Text += s +  "\r\n"
                        } 
                } 
        } 
}
 
 
3、演示 DataGrid 的几个新增的功能
DataGrid.xaml
<navigation:Page xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"    x:Class="Silverlight30.Control.DataGrid"    
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                     mc:Ignorable="d" 
                     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
                     d:DesignWidth="640" d:DesignHeight="480" 
                     Title="DataGrid Page"> 
        <Grid x:Name="LayoutRoot"> 
         
                <!-- 
                        新增功能:结合 PagedCollectionView 实现数据分组;增加了一些编辑数据的相关事件;结合 DataAnnotations 实现数据验证 
                --> 
                <data:DataGrid x:Name="dataGrid" AutoGenerateColumns="False"> 
                        <data:DataGrid.Columns> 
                                <data:DataGridTextColumn Binding="{Binding Name}" Header="名字" /> 
                                <data:DataGridTextColumn Binding="{Binding DateOfBirth}" Header="生日" /> 
                        </data:DataGrid.Columns> 
                </data:DataGrid> 

        </Grid> 
</navigation:Page>
 
DataGrid.xaml.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.Windows.Navigation; 
 
using System.Xml.Linq; 
using Silverlight30.Model; 
using System.Windows.Data; 
 
namespace Silverlight30.Control 

         public partial  class DataGrid : Page 
        { 
                 public DataGrid() 
                { 
                        InitializeComponent(); 
 
                         this.Loaded +=  new RoutedEventHandler(DataGrid_Loaded); 
                } 
 
                 void DataGrid_Loaded( object sender, RoutedEventArgs e) 
                { 
                        List<EmployeeModel> employees =  new List<EmployeeModel>(); 
                        employees.Add( new EmployeeModel { Name =  "aabb", DateOfBirth = DateTime.Now, Salary = 1111 }); 
                        employees.Add( new EmployeeModel { Name =  "aabc", DateOfBirth = DateTime.Now, Salary = 1111 }); 
                        employees.Add( new EmployeeModel { Name =  "abcc", DateOfBirth = DateTime.Now, Salary = 1122 }); 
                        employees.Add( new EmployeeModel { Name =  "abbc", DateOfBirth = DateTime.Now, Salary = 1122 }); 
                        employees.Add( new EmployeeModel { Name =  "aaab", DateOfBirth = DateTime.Now, Salary = 1122 }); 
                        employees.Add( new EmployeeModel { Name =  "bcca", DateOfBirth = DateTime.Now, Salary = 1122 }); 
                        employees.Add( new EmployeeModel { Name =  "bbac", DateOfBirth = DateTime.Now, Salary = 1133 }); 
                        employees.Add( new EmployeeModel { Name =  "cbaa", DateOfBirth = DateTime.Now, Salary = 1133 }); 
                        employees.Add( new EmployeeModel { Name =  "ccaa", DateOfBirth = DateTime.Now, Salary = 1133 }); 
                        employees.Add( new EmployeeModel { Name =  "cccb", DateOfBirth = DateTime.Now, Salary = 1144 }); 
                        employees.Add( new EmployeeModel { Name =  "cccc", DateOfBirth = DateTime.Now, Salary = 1155 }); 
                        employees.Add( new EmployeeModel { Name =  "cabc", DateOfBirth = DateTime.Now, Salary = 1155 }); 
                        employees.Add( new EmployeeModel { Name =  "cabb", DateOfBirth = DateTime.Now, Salary = 1166 }); 
 
                         // 通过 PagedCollectionView 的 GroupDescriptions 设置需要分组的字段,绑定到 DataGrid 后,DataGrid会自动对数据做分组显示 
                        PagedCollectionView view =  new PagedCollectionView(employees); 
                        view.GroupDescriptions.Add( new PropertyGroupDescription( "Salary")); 
 
                        dataGrid.ItemsSource = view; 
                } 
        } 
}
 
 
4、演示 MediaElement 的增强点:以 H.264 编码,MP4为容器做演示
MediaElement.xaml
<navigation:Page x:Class="Silverlight30.Control.MediaElement"    
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                     mc:Ignorable="d" 
                     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
                     d:DesignWidth="640" d:DesignHeight="480" 
                     Title="MediaElement Page"> 
        <Grid x:Name="LayoutRoot"> 
         
                <!-- 
                        增加了对视频 H.264 编码格式的支持,和对音频 AAC 编码格式的支持 
                        本例以 H.264 编码,MP4为容器做演示 
                --> 
                <MediaElement x:Name="mediaElement" Source="/Resource/Demo.mp4" Width="320" Height="240" 
                        AutoPlay="True" MediaEnded="mediaElement_MediaEnded" /> 
                         
        </Grid> 
</navigation:Page>
 
MediaElement.xaml.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.Windows.Navigation; 
 
namespace Silverlight30.Control 

         public partial  class MediaElement : Page 
        { 
                 public MediaElement() 
                { 
                        InitializeComponent(); 
                } 
 
                 private  void mediaElement_MediaEnded( object sender, RoutedEventArgs e) 
                { 
                         // 重播 
                        mediaElement.Stop(); 
                        mediaElement.Play(); 
                } 
        } 
}
 
 
 
      本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/342756,如需转载请自行联系原作者



相关文章
Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象
原文:Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象 原创文章,如需转载,请注明出处。   最近在一直研究Silverlight下的数据绑定控件,发现有这样两个接口IEditableObject 和IEditableCollectionView,记录一下结论,欢迎交流指正。
872 0

热门文章

最新文章