WindowsPhone开发如何创建动态启动界面

本文采用WindowsPhone 8 SDK,vs 2013,此方法同样适用于wp7,wp8.1.

一般的wp8应用程序在创建时,项目目录中会默认提供一张在程序启动时显示的一张图片,名字叫SplashScreenImage.jpg。这是因为在程序启动时可能会耗费一定的时间来加载首界面,这时这张图片就会先出现。如果你要改变启动画面,使用自己定义好的另外的图片替换它就可以。但是如果,要在启动画面上显示动态的效果呢?下面就来说一下。

为了要在程序启动时显示动态界面,就要将一个页面在MainPage之前显示。也就是说,要把之前的默认的启动画面去掉。为了实现这个效果,需要先把SplashScreenImage.jpg删除掉。创建一个UserControl来显示动态效果,在MianPage显示之前,先显示该UserControl.同时控制其显示的时间,这个时间我们也是可以控制的。这里还要用到BackgroundWorker线程。

使用BackgroundWorker类,你在一个单独的后台线程进行操作,而让wp的渲染线程和UI线程继续执行不受影响。当线程中的事务处理完后可以反馈到ui线程上。

注意:在DoWork事件处理函数中不要操作任何用户界面对象。当然ProgressChanged和RunWorkerCompleted事件回调函数中,你能操作用户界面。具体的使用在后面的代码中,有详细说明。

首先,创建一个UserControl,如下图:

添加新建项

创建好了之后,要将其宽高改为height =800 ,weight = 480,不然覆盖不了整个屏幕。

下面是该control的xmal的代码,代码中有注释。

<UserControl x:Class="LoadingPage.LoadingControl"
    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"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    d:DesignHeight="800"  d:DesignWidth="480"> <!--设置宽高-->

    <!--控件动画资源定义-->
    <UserControl.Resources>
        <!--使用故事板-->
        <Storyboard x:Key="LoadAnimation">
            <DoubleAnimation From="0" To="359" Duration="0:0:1" RepeatBehavior="Forever"
                             Storyboard.TargetName="VisualTransform"
                             Storyboard.TargetProperty="Angle"/>
        </Storyboard>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="{StaticResource PhoneAccentBrush}">
        <!--使用 * 可以平均分配布局-->
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <TextBlock Text="正在加载,请稍后。。。" Grid.Row="1" VerticalAlignment="Center"
                   HorizontalAlignment="Center"/>
        <!-- grid里,使用path画一个圈,而动画以该grid为单位-->
        <Grid  x:Name="Visual" Margin="0,30,0,0" RenderTransformOrigin="0.5,0.5" Grid.Row="2"
              VerticalAlignment="Center" HorizontalAlignment="Center">
            <Grid.RenderTransform>
                <TransformGroup>
                    <RotateTransform x:Name="VisualTransform"/>
                </TransformGroup>
            </Grid.RenderTransform>
            <Path Width="50" Height="50" Stretch="Fill"
                  StrokeThickness="5"
                  StrokeStartLineCap="Round" Data="M1,0 A1,2,90,1,1,0,0">
                <Path.Stroke>
                    <LinearGradientBrush StartPoint="1,0.8" EndPoint="0.3,0.1">
                        <GradientStop Color="White" Offset="0"/>
                        <GradientStop Color="Transparent" Offset="1"/>
                    </LinearGradientBrush>
                </Path.Stroke>
            </Path>
        </Grid>
    </Grid>
</UserControl>

其cs 代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using System.Windows.Media.Animation;

namespace LoadingPage
{
    public partial class LoadingControl : UserControl
    {
        public LoadingControl()
        {
            InitializeComponent();
            //设置根grid布局宽高为实际设备屏幕的宽高
            LayoutRoot.Height = App.Current.Host.Content.ActualHeight;
            LayoutRoot.Width = App.Current.Host.Content.ActualWidth;
            //在loaded和unloaded时,添加路由事件,开始和停止动画
            this.Loaded += new RoutedEventHandler(LoadingScreenControl_Loaded);
            this.Unloaded += new RoutedEventHandler(LoadingScreenControl_Unloaded);
        }

        void LoadingScreenControl_Unloaded(object sender, RoutedEventArgs e)
        {
            //加载动画资源
            Storyboard sb = this.Resources["LoadAnimation"] as Storyboard;
            //停止动画
            sb.Stop();
        }

        void LoadingScreenControl_Loaded(object sender, RoutedEventArgs e)
        {
            //加载动画资源
            Storyboard sb = this.Resources["LoadAnimation"] as Storyboard;
            //开始动画
            sb.Begin();
        }
    }
}

接下来,将要在MainPage中加入要处理的代码

1、添加以下命名空间,在MainPage.xaml.cs文件中:

using System.Threading;

using System.Windows.Controls.Primitives;

2、使用Popup类,将UserControl添加到Popup中,使其显示。

3、使用BackgroundWorker,进行计时(也可以做其他的初始化操作),让开始界面显示一定时间。

4、结束,取消显示popup

下面是MainPage.xaml.cs代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using LoadingPage.Resources;
using System.Windows.Controls.Primitives;
using System.ComponentModel;
using System.Threading;

namespace LoadingPage
{
    public partial class MainPage : PhoneApplicationPage
    {
        // 构造函数
        public MainPage()
        {
            InitializeComponent();
            //在主页初始化后调用动态加载界面
            LoadWelcomePage(2000);
            // 用于本地化 ApplicationBar 的示例代码
            //BuildLocalizedApplicationBar();
        }

        void LoadWelcomePage(int time)
        {
            //使用popup,将用户控件LoadingControl作为其孩子
            Popup popup = new Popup();
            LoadingControl loadingcontrol = new LoadingControl();
            popup.Child = loadingcontrol;
            popup.IsOpen = true;//设置为true 才会显示

            //新建后台线程
            BackgroundWorker bkw = new BackgroundWorker();
            //需要在后台线程中做的工作,注意不能操作与UI线程相关内容
            bkw.DoWork += ( (s,e) =>
            {
                Thread.Sleep(time);
            });
            //后台线程工作执行完后所要做的事情
            bkw.RunWorkerCompleted += ( (s,e) =>
            {
                this.Dispatcher.BeginInvoke(() =>
                {
                    popup.IsOpen = false
                });

            });
            //执行后台线程
            bkw.RunWorkerAsync();
        }
        // 用于生成本地化 ApplicationBar 的示例代码
        //private void BuildLocalizedApplicationBar()
        //{
        //    // 将页面的 ApplicationBar 设置为 ApplicationBar 的新实例。
        //    ApplicationBar = new ApplicationBar();

        //    // 创建新按钮并将文本值设置为 AppResources 中的本地化字符串。
        //    ApplicationBarIconButton appBarButton = new ApplicationBarIconButton(new Uri("/Assets/AppBar/appbar.add.rest.png", UriKind.Relative));
        //    appBarButton.Text = AppResources.AppBarButtonText;
        //    ApplicationBar.Buttons.Add(appBarButton);

        //    // 使用 AppResources 中的本地化字符串创建新菜单项。
        //    ApplicationBarMenuItem appBarMenuItem = new ApplicationBarMenuItem(AppResources.AppBarMenuItemText);
        //    ApplicationBar.MenuItems.Add(appBarMenuItem);
        //}
    }
}

Thread.Sleep()方法在using System.Threading;命名空间中

BackgroundWorker在using System.Windows.Controls.Primitives;命名空间中

最后

如果不使用popup和usercontrol,而创建一个新的page,设置其为首页,是不是也可以。但是这样就会被页面堆栈记录,当进行返回操作时,就会返回到该也页面上来,就失去了起意义了。当然也可以管理页面堆栈,删除其记录,但是这样,就显得麻烦了。。

源码在这里

时间: 2024-08-29 00:21:19

WindowsPhone开发如何创建动态启动界面的相关文章

利用开发工具创建动态图表

举例:前提是要搭建好基表,稍后会写一篇文章告知如何搭建完美基表. 一.最简单的一级菜单形式: 有甲.乙.丙三个工厂,要求通过点选工厂看到三天的生产趋势图. 备注:基表的搭建非常重要,日期严格按照列排布. 1.通过excel开发工具-插入-列表框-选中列表框右键设置控件格式,如图: 当选中甲时,单元格链接A1的数据显示为1,当选乙时显示2,…… 2.通过excel开发工具-插入-滚动条-选中滚动条右键设置控件格式-控制,单元格链接A2,通过点击滚动条来前后呈现不同日期工厂的生产情况. 3.通过in

iOS开发之启动动画(动态欢迎界面,非静态Default)

最近在使用<青葱日记>这款App,发现它的启动界面做的很精美. 不同我自己之前简单的替换Default.png图片. 它的动态效果做的不错. 于是乎,花了点时间,自己实现了这个功能. 其实也很简单,具体效果如下 实现起来也不困难.因为我们知道,在应用启动的时候,它会先执行AppDelegate.m中的 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)la

Qt Quick应用开发介绍 10-12(动态界面, 实践学习, 总结和扩展)

Chapter10 UI Dynamics and Dynamic UI 动态界面 前面章节学习了在开发时添加item, 让它们invisible; 该怎么做可以让程序根据不同的数据和用户输入来有不同的显示? 这些变化可能比visibility复杂; 我们怎样才能做到让程序UI的动态变化更appealing吸引人, 甚至成为用户体验的一部分? 10.1 Using States 使用state 网络连接对于现在的版本中天气相关的部件是必须的; 它让网络数据可视化; 如果你的电脑不在线, 启动cl

WinForm界面开发之 启动界面

我们在开发桌面应用程序的时候,由于程序启动比较慢,往往为了提高用户的体验,增加一个闪屏,也就是SplashScreen,好处有:1.让用户看到加载的过程,提高程序的交互响应:2.可以简短展示或者介绍程序的功能或者展示Logo,给客户较深的印象. 本人在开发的共享软件中,对于启动比较慢的程序,也倾向于引入这个控件来展示下,先看看软件启动的时候的效果 中间的那些文字“正在初始化应用程序......”可以根据加载的进度显示不同的内容,当然最好简单扼要了,其他的内容你也可以视需要做相应变化,因为这个是一

【转】使用命令行方式创建和启动android模拟器

原文网址:http://blog.csdn.net/tiandinilv/article/details/8953001 1.Android模拟器介绍 Android中提供了一个模拟器来模拟ARM核的移动设备.Android的模拟器是基于QEMU开发的,QEMU是一个有名的开源虚拟机项目(详见http://bellard.org/qemu/),它可以提供一个虚拟的ARM移动设备.Android模拟器被命名为goldfish,用来模拟包括下面一些功能的ARM SoC: * ARM926ej-S C

Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法

原文:Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法 Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我们讲了Raspberry安装Win10 IoT系统及搭建Visual Studio 2015开发环境的方法(http://www.cnblogs.com/cloudtech/p/5562120.html)

cocos2d-x -3.81+win7+vs2013开发环境创建新的项目

cocos2d-x -3.81+win7+vs2013开发环境创建新的项目 1.准备阶段 (1) vs2013下载及安装 (2)cocos2d-x 3.8.1下载及解压 (3)python下载及安装(新版本cocos2d需要python创建工程) 2.编译cocos2d-x 3.8.1 (1) cocos2d-x 3.8.1解压后, 打开E:\cocos2d-x-3.8.1\build文件夹, 双击cocos2d-win32.sln打开解决方案. (2) 在解决方案准备就绪后, 右键cpp-te

IDEA 创建 动态 Web 项目的正确姿势

打开 IDEA,点击 Create New Project 左侧选中Java Enterprise, Java EE version 下拉框选择 Java 7 解释一下,这里选择 Java 7 是为了解决一个 IDEA 在创建动态 Web 项目流程上的小 Bug. 左侧选中 Java,然后再选中回 Java Enterprise,Java EE version 下拉框选择 Java 8,选择项目其他相应信息 如果没有上面切换 Java EE version 的操作,那么这一步在选中 Web Ap

如何创建、启动OC4J服务器

Java中常用的Web服务器有很多,今天我在这里记录一下如何创建.启动.部署OC4J服务器.当然创建.启动.部署服务器的方式有很多种,我只介绍一下我用的这种.具体步骤如下: 1 下载OC4J的服务器文件压缩文件,并解压. 2 确保oc4j配置文件的正确性,这里需要确定两个条件: a. 必须确保JDK版本在1.6(包含)以下 b. 确保oc4j_extended_101330\bin 目录下的 oc4j.cmd 文件中配 置正确 ORACLE_HOME:必须配置为oc4j文件夹的路径 JAVA_H