做silvelight也有一段时间了,相册、游戏,刚刚完成的showcase这个小程序算是一个阶段了。这里就以showcase这个项目来做一下CaseStudy。
数据篇-Loading的制作
silverlight自带了一个loading。但是由于界面的需求可能需要定制化一下。这里我的思路是做两个sl文件用其中一个去加载另外一个。也就是说有两个xap文件一个是主要的也就是你做的silverlight程序文件,另一个小的是用来做loading的。
参考文章: 技巧:在Silverlight中如何访问外部xap文件中UserControl
代码语言:js复制public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
App.Current.Host.Content.Resized = new EventHandler(Content_Resized);
App.Current.Host.Content.FullScreenChanged = new EventHandler(Content_FullScreenChanged);
this.Init();
}
private void Init()
{
Uri address = new Uri(HtmlPage.Document.DocumentUri, "ClientBin/showcase.xap");
WebClient webClient = new WebClient();
webClient.OpenReadCompleted = new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
webClient.DownloadProgressChanged = new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
webClient.OpenReadAsync(address);
}
void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
//在这里实现你的loading动画
double per = Convert.ToDouble(e.ProgressPercentage) / Convert.ToDouble(100);
loadBar.Height = (App.Current.Host.Content.ActualHeight - 16) * per;
}
void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
Assembly assembly = LoadAssemblyFromXap(e.Result, "showcase.dll");
UIElement element = assembly.CreateInstance("showcase.Page") as UIElement;
this.LayoutRoot.Children.Clear();
this.LayoutRoot.Children.Add(element);
}
Assembly LoadAssemblyFromXap(Stream packageStream, String assemblyName)
{
Stream stream = Application.GetResourceStream(
new StreamResourceInfo(packageStream, null),
new Uri("AppManifest.xaml", UriKind.Relative)).Stream;
String appManifestString = new StreamReader(stream).ReadToEnd();
Deployment deployment = (Deployment)XamlReader.Load(appManifestString);
Assembly assembly = null;
foreach (AssemblyPart assemblyPart in deployment.Parts)
{
if (assemblyPart.Source == assemblyName)
{
String source = assemblyPart.Source;
StreamResourceInfo streamInfo = Application.GetResourceStream(
new StreamResourceInfo(packageStream,
"application/binary"),
new Uri(source, UriKind.Relative));
assembly = assemblyPart.Load(streamInfo.Stream);
break;
}
}
return assembly;
}
void Content_FullScreenChanged(object sender, EventArgs e)
{
this.ResizeFrame();
}
void Content_Resized(object sender, EventArgs e)
{
this.ResizeFrame();
}
void ResizeFrame()
{
(this as UserControl).Width = App.Current.Host.Content.ActualWidth;
(this as UserControl).Height = App.Current.Host.Content.ActualHeight;
}
void FullScreenMode()
{
App.Current.Host.Content.IsFullScreen = !App.Current.Host.Content.IsFullScreen;
}
}