您的位置:首页 > 其它

Silverlight读取Zip文件中的图片与视频

2013-11-20 09:59 239 查看


Silverlight读取Zip文件中的图片与视频

时间:2010-08-1711:01来源:博客园
作者:Ringgo.Yao点击:次

这篇文章是在其基础上增加了一些功能,从而构建出一个简单但较为完整的Demo。首先看看Demo的截图:
  

这篇文章是在其基础上增加了一些功能,从而构建出一个简单但较为完整的Demo。
首先看看Demo的截图:









下面我将一步步展示实现这个Demo的过程,这个需求就是读出Zip文件中的图片与视频。
Demo整体架构:




首先我们准备几张图片和视频,然后将其压缩至resource.zip文件中,做完之后,我们建立一个resource.xml文件记录压缩包内的资源
<?xmlversion="1.0"encoding="utf-8"?>
<files>
<filetype="video"name="a.wmv"/>
<filetype="image"name="1.jpg"/>
<filetype="image"name="2.jpg"/>
<filetype="image"name="3.jpg"/>
<filetype="image"name="4.jpg"/>
</files>

这个xml文件就记录了文件的类型和名称,完成之后我们将其压缩至resource.zip中(请注意:这一步对后面读取流会有影响)
现在我们将UI设计好
<Imagex:Name="Image"/>
<MediaElementx:Name="Video"/>
<StackPanelHorizontalAlignment="Left"VerticalAlignment="Bottom"Opacity="0.5"Orientation="Horizontal"Margin="5,0,0,0"Name="stack">
<ButtonContent="Prev"x:Name="PrevButton"Height="30"Margin="0,0,5,0"Width="80"Opacity="1"Cursor="Hand"IsEnabled="False"/>
<Buttonx:Name="NextButton"Height="30"Margin="0,0,5,0"Width="80"Opacity="1"Content="Next"Cursor="Hand"IsEnabled="False"/>
</StackPanel>

在UI上放置了一个Image和MediaElement控件来显示读取的资源
下面我们开始建立ResourceInfo.cs文件
publicenumResourceType
{
Video,
Image
}
publicclassResourceInfo
{
publicResourceTypeType
{
get;set;
}
publicstringName
{
get;set;
}
}

文件的类型以枚举的形式表示,现在我们就在MainPage.xaml.cs中以WebClient完成数据的读取工作
先声明3个类成员变量:
privateStreamResourceInfozip;
privateList<ResourceInfo>resourceInfo;
privateintindex=0;

现在我们就先获取流,其完整代码:
publicvoidLoad(objectsender,RoutedEventArgse)
{
Uriuri=newUri(HtmlPage.Document.DocumentUri,"resource.zip");
WebClientwebClient=newWebClient();
webClient.OpenReadCompleted+=(obj,args)=>
{
if(args.Error!=null)
{
return;
}
//这几步将读出的流信息封装到reader中,这样便于后面使用LinqToXml操作
zip=newStreamResourceInfo(args.Result,null);
StreamResourceInfomaininfo=Application.GetResourceStream(zip,newUri("resource.xml",UriKind.Relative));
StreamReaderreader=newStreamReader(maininfo.Stream);
XDocumentdoc=XDocument.Load(reader);
varfile=fromcindoc.Descendants("file")
selectnewResourceInfo
{
Type=(ResourceType)Enum.Parse(typeof(ResourceType),c.Attribute("type").Value,true),
Name=c.Attribute("name").Value
};
resourceInfo=newList<ResourceInfo>();
resourceInfo.AddRange(file);
this.PrevButton.IsEnabled=true;
this.NextButton.IsEnabled=true;
Display(resourceInfo[0]);
};
webClient.OpenReadAsync(uri);
}
publicvoidDisplay(ResourceInforesource)
{
//获取相应的流数据
StreamResourceInfomedia=Application.GetResourceStream(zip,newUri(resource.Name,UriKind.Relative));
switch(resource.Type)
{
caseResourceType.Image:
Image.Visibility=Visibility.Visible;
Video.Visibility=Visibility.Collapsed;
BitmapImageimage=newBitmapImage();
image.SetSource(media.Stream);
Image.Source=image;
break;
caseResourceType.Video:
Image.Visibility=Visibility.Collapsed;
Video.Visibility=Visibility.Visible;
Video.SetSource(media.Stream);
Video.Play();
break;
}
}

事实上加载这段代码后,我们已经可以将xml文件中标注的第一个资源a.wmv在页面进行成功的播放了
我们继续界面上的Button实现的循环显示上一条,下一条资源功能
privatevoidStopVideo()
{
if(resourceInfo[index].Type==ResourceType.Video)
{
Video.Stop();
}
}
privatevoidPrevButton_Click(objectsender,RoutedEventArgse)
{
StopVideo();
if(--index<0)
{
index=resourceInfo.Count-1;
}
Display(resourceInfo[index]);
}
privatevoidNextButton_Click(objectsender,RoutedEventArgse)
{
StopVideo();
if(++index>=resourceInfo.Count)
{
index=0;
}
Display(resourceInfo[index]);
}

如此我们就完成了这个Demo

原文地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: