Silverlight 4 新特性之Silverlight as Drop Target

本文展示了如何在Silverlight应用中实现文件系统中文件的拖拽功能,包括页面布局设计、后台代码实现以及多文件同时拖拽的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上次项目中写过多篇关于拖拽的实现. 这些拖拽都是控件之间的效果. Silverlight 4 中我们甚至可以直接把文件系统中文件拖拽到Silverlight Application中承载. 这就是 silverlight 4中新特性Silverlight As Drop Target 支持这一点. 为了达到演示目的. 使用桌面图片拖拽到Silverlight Application中ScrollViewer动态显示. 先体验一下[你可以尝试从本地文件系统直接拖拽图片到这个Silverlight Application中看一下效果]:

  Get Microsoft Silverlight

实现步骤:

<1>: 页面布局

 1    < StackPanel  x:Name ="LayoutRoot"  Background ="White" >
 2           < TextBlock  Text ="  " ></ TextBlock >
 3           < TextBlock  Text ="Silverlight AS Drop target.-chenkai[10.6.28]"  VerticalAlignment ="Center"  HorizontalAlignment ="Left"  FontSize ="16"  Foreground ="Red"   FontFamily ="Comic Sans MS"  FontWeight ="BOld"  Height ="25"  Width ="655"   />
 4           < ScrollViewer  x:Name ="ImagesTarget"  Background ="White"   Height ="360"  BorderBrush ="Red"
 5                        VerticalScrollBarVisibility ="Hidden"  HorizontalScrollBarVisibility ="Auto"  AllowDrop ="True" >
 6                   < ItemsControl  x:Name ="ImageList"  Height ="353" >
 7                       <!-- 定义数据模板 支持格式是Image图片 很重要 不然会包invaid异常 数据模板确实很强大. -->
 8                       < ItemsControl.ItemTemplate >
 9                           < DataTemplate >
10                               < Image  Source =" {Binding} "  Margin ="5"  Stretch ="UniformToFill"  Height ="240"   />
11                           </ DataTemplate >
12                       </ ItemsControl.ItemTemplate >
13                       <!-- 项排序模式Horizontal 居中 -->
14                       < ItemsControl.ItemsPanel >
15                           < ItemsPanelTemplate >
16                               < StackPanel  Orientation ="Horizontal"  VerticalAlignment ="Center"  HorizontalAlignment ="Center" />
17                           </ ItemsPanelTemplate >
18                       </ ItemsControl.ItemsPanel >
19                   </ ItemsControl >
20               </ ScrollViewer >
21       </ StackPanel >

<2>:后台实现代码

ExpandedBlockStart.gif 代码
 1    // 定义存储Image集合.
 2          ObservableCollection < BitmapImage >  _images  =   new  ObservableCollection < BitmapImage > ();
 3 
 4           public  MainPage()
 5          {
 6              InitializeComponent();
 7               this .Loaded  +=   new  RoutedEventHandler(MainPage_Loaded);
 8          }
 9 
10           void  MainPage_Loaded( object  sender, RoutedEventArgs e)
11          {
12               // 如果Image数据则直接加载进来.
13              ImageList.ItemsSource  =  _images;
14              ImagesTarget.Drop  +=   new  DragEventHandler(ImagesTarget_Drop);
15          }
16 
17           void  ImagesTarget_Drop( object  sender, DragEventArgs e)
18          {
19               // 判断拖拽数据是否存在
20               if  (e.Data  ==   null )
21              {
22                   return ;
23              }
24               else
25              {
26                   // 利用Fileinfo 来初始化关于文件系统日常操作io对象 Fileinfo 【】数组 意味支持多张Image同时拖拽Silverlight Application
27                  IDataObject dataObject  =  e.Data  as  IDataObject;
28                  FileInfo[] files  = dataObject.GetData(DataFormats.FileDrop)  as  FileInfo[];
29 
30                   foreach  (FileInfo file  in  files)
31                  {
32                       try
33                      {
34                           using  (var stream  =  file.OpenRead())
35                          {
36                               // 读取拖拽中图片源.
37                              var imageSource  =   new  BitmapImage();
38                              imageSource.SetSource(stream);
39                               // 添加到集合中.
40                              _images.Add(imageSource);
41                          }
42                      }
43                       catch  (Exception)
44                      {
45                          MessageBox.Show( " Not a suppoted image. " );
46                      }
47                  }
48              }
49          }

因为前台ScrollView中DataTemplate中定义格式是Image绑定. 后台数据源用到ObservableCollection<BitmapImage>来封装从拖拽中得到图片数据. 另外一个就是FileInfo,提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建 FileStream 对象, 既然通过Fileinfo得到FileStream对象 其他操作就是平常IO操作. 而Fileinfo[]数组则是用来支持同时拖拽多个对象.关于Fileinfo 更多详细资料请参见MSDN.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值