稳扎稳打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://www.voidcn.com/article/p-boakcggz-tq.html


示例
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",Salary = 1111 });

                        employees.Add( new EmployeeModel { Name = "abcc",Salary = 1122 });

                        employees.Add( new EmployeeModel { Name = "abbc",Salary = 1122 });

                        employees.Add( new EmployeeModel { Name = "aaab",Salary = 1122 });

                        employees.Add( new EmployeeModel { Name = "bcca",Salary = 1122 });

                        employees.Add( new EmployeeModel { Name = "bbac",Salary = 1133 });

                        employees.Add( new EmployeeModel { Name = "cbaa",Salary = 1133 });

                        employees.Add( new EmployeeModel { Name = "ccaa",Salary = 1133 });

                        employees.Add( new EmployeeModel { Name = "cccb",Salary = 1144 });

                        employees.Add( new EmployeeModel { Name = "cccc",Salary = 1155 });

                        employees.Add( new EmployeeModel { Name = "cabc",Salary = 1155 });

                        employees.Add( new EmployeeModel { Name = "cabb",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();

                }

        }

}
 
 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


如何在Silverlight4(XAML)中绑定IsEnabled属性?我试过简单的IsEnabled=“{BindingABC}”,但这不起作用–MenuItem总是启用.提前感谢您的线索!干杯编辑:有趣的是,当设置Mode=TwoWay时,绑定似乎有效.但是,在菜单项上移动鼠标后,将更新上下文菜单的外观.这是异步工作吗?右键
我正在编写我的第一个vb.net应用程序(但我也会在这里标记c#,因为我确信即使是一个c#人也可以使用类似的.net实现来回答这个问题).我申请的简短说明:我的桌面应用程序将仅在win平台上运行,使用vb.net,它是一个简单的网吧管理软件,在服务器上运行服务器gui,在工作站上运行客户端gui,
ProcessFile()是在UIThread上运行还是在单独的线程上运行.如果它在UIThread上,如何将文件请求和ProcessFile()移动到单独的线程?varxClient=newServiceReference1.Service1SoapClient();xClient.Retrieve_File_Completed+=newEventHandler<ServiceReference1.Retrieve_Fi
我从同行那里听说,对sharepoint的了解对职业生涯有益.我们不在办公室使用sharepoint.所以不知道如何开始.这些是我的新手问题>学习共享点值得努力吗?>学习sharepoint的资源在哪里?>我是否应该考虑开发哪些参考项目?感谢您的意见.解决方法:SharePoint以如此积极的方式改变了我的职业
我正在尝试保存一个类我的类对象的集合.我收到一个错误说明:Thecollectiondatacontracttype‘System.Collections.Generic.Listcannotbedeserializedbecauseitdoesnothaveapublicparameterlessconstructor.Addingapublicparameterlessconstructorwillf
我需要根据Silverlight中的某些配置值设置给定控件的Style.我想有可能从两种可用的样式(静态资源)中选择一个控件样式.我试图做一些像:<TextBoxStyle="{BindingABC}"/>哪里publicstringABC{get{return"{StaticResourceMyStyle}";}}不幸的是,这不起作用.你有
我刚买了第一台Android设备,我喜欢它…我也很喜欢你可以创建自己的应用程序并随意分发它们.我已经阅读了一些关于Monodroid的内容,而且显然微软希望将Silverlight放在这些设备上,尽管没有太多关于它们的信息……但是Moonlight呢?如果Monodroid就像Mono……为什么我们需要它呢?相反
我们的ASP.NET网站允许用户执行各种查询,并根据从数据库查询的结果显示网络图(如UML图).目前,我们正在生成一个位图并显示它.但由于我们需要支持允许用户以交互方式显示/隐藏某些块的功能,因此我们计划使用Silverlight来渲染图形.我们还计划在未来添加更多互动.我有两个问题:>ASP
我正在开发一个Silverlight4应用程序,我已经创建了一个自定义的启动画面.乍一看,自定义启动画面运行良好–非常好.几天后,我开始注意到闪屏不再显示,屏幕仍然是空白.这似乎只发生在我打开多个指向同一个应用程序的IE选项卡/窗口时.前几个将加载正常,而以下选项卡/窗口将保持“白
这是我的XAML:<ImageVerticalAlignment="Center"HorizontalAlignment="Center"Source="{BindingInput,Converter={StaticResourceByteArrayToBitmapConverter}}"><Image.Rend
问候,我有一个ItemsControl,我更改了模板,为绑定的ItemsSource中的每个对象显示一个RadioButton.但是ItemsSource可以为空,当它为空时我想显示默认值.像“绑定列表中没有可供您选择的项目”……我想到的一种方法是将ItemsControl.Visibility设置为Collapsed,并将TextBlock.Vsibi
堆栈溢出的第一个问题……我是C#的新手,但在学习它时却非常直接.几分钟前我才看到这个tutorial.通过各种c#技术阅读WCF,WPF,Silverlight,c#和asp.net,这是很多技术都可以用c#来实现.我将创建一个Web应用程序c#.我认为SilverLight似乎是我最好的选择.该应用程序将拥有一个数
我正在使用MVVM(Model-View-ViewModel)模式编写应用程序,并利用MicrosoftP&P团队的Prism和Unity位.我有一个包含项目列表的视图.这些项包含在ViewModel中的ObservableCollection中,View中的列表框是数据绑定的(ViewModel设置为View的DataContext).在ViewModel中,我有一个运行的
我有一个应用程序,它在首次运行时显示免责声明页面.选择“接受”或“拒绝”后,您再也看不到该页面了.但是,当您在第一次运行后按后退键尝试关闭应用程序时,您将返回免责声明页面,然后再次点击该页面,返回主页面,然后再次退出.这仅在应用程序第一次运行时发生,但我希望应用程序在
我正在尝试在SilverlightforWindowsPhone中使用异步HttpWebRequest.一切都很完美,直到我到达我应该打电话的地方privatestaticManualResetEventallDone=newManualResetEvent(false);...request.BeginGetResponse(newAsyncCallback(GetResponseCallback),request);a
嗨,我有两个Writablebitmap,一个来自jpg,另一个来自png,并使用此方法在循环中混合颜色:privatestaticColorMix(Colorfrom,Colorto,floatpercent){floatamountFrom=1.0f-percent;returnColor.FromArgb((byte)(from.A*amountFrom+to.A*perc
我需要开发一个程序,它包含一个图像(png),中心有一个洞.在这个图像下将有一个框架,我想点击图像的透明孔我可以点击框架内的按钮.我不知道是否有一种方法可以通过图像或其他方式传播点击.谢谢你的帮助解决方法:你在图像上将IsHitTestVisible设置为false,然后点击浏览.
我正在研究一个silverlight应用程序,我发现List没有Find扩展方法说,List<Something>list=newList<Something>(something);list.Remove(list.Find(e=>e.id==10));没有查找扩展方法我错过了什么?解决方法:它不包括在内以减小运行时的大小.建议您使用LINQ扩展,例如First
我试图弄清楚如何设置Path元素的Data属性来获得此类型的软角:alttexthttp://i42.tinypic.com/1rzu6w.jpg现在我只有这样的尖角:alttexthttp://i42.tinypic.com/2eeleah.jpg我尝试用椭圆玩,但我无法得到我想要的东西.谢谢最佳答案:路径的段具有IsSmoothJoin属性,默认为false.
问题我有一个在远程服务器上运行的restfulWeb服务.我已经制作了一个使用它的WP7应用程序,所以我知道它有效.我正在将应用程序移植到SilverlightWeb应用程序并遇到问题.我已经包含了代码的简化版本以及引发的错误.EndGetResponse方法抛出错误.随意询问更多信息.我一直在寻找解