• 【Win8】动画&异步编程


    一、动画(Animation)
    1、StoryBoard基础
       在MainPage.xaml页面:
     (1)添加一个Button,然后设置使得Button在X轴上“自行展开--缩放”。
        <1>设置Button:

    <Button Content="Button" HorizontalAlignment="Left" Margin="123,42,0,0" VerticalAlignment="Top" Height="101" Width="296" Click="Button_Click_1" >
                <Button.RenderTransform>
                    <ScaleTransform x:Name="st1"></ScaleTransform>
                </Button.RenderTransform>
    </Button>

        <2>添加资源:

      <Page.Resources>
            <Storyboard x:Name="sb1">           //Storyboard与其他资源控件特殊的是:x:Name,只有StoryBoard可以设置为x:Name,而其他的则设置为x:Key
                <DoubleAnimation Storyboard.TargetName="st1"
                                 Storyboard.TargetProperty="ScaleX"
                                 From="0" To="3"></DoubleAnimation>
            </Storyboard>
        </Page.Resources>

         <3>在Click事件中添加: sb1.Begin();
          ok,运行,点击Button时,会看到Button沿着 X轴 从“0”到“3”自行展开缩放
    (2)在上述条件下,再进行设置使得Button同时在X轴上“自行展开--缩放”和在Y轴上“360度旋转”。
        <1>在Button里再添加:

     <Button.Projection>
                    <PlaneProjection x:Name="pp1" RotationY="30"></PlaneProjection>
     </Button.Projection>

        <2>在资源中再添加:

     <Storyboard x:Name="sb2">
                <DoubleAnimation Storyboard.TargetName="pp1"
                                 Storyboard.TargetProperty="RotationY"
                                 From="0" To="360"></DoubleAnimation>
     </Storyboard>

        <3>在Click事件中再添加: sb2.Begin();
           ok,运行,点击Button时,会看到Button在X轴和Y轴上同时变化。(如果分开播放,则多一个Completed事件即可。)
    (3)Storyboard的其他属性:
           在资源中添加 Duration="00:00:05",指的是在5秒中完成动画(指动画在From\To之间变化时的持续时长);AutoReveverce="True",自动反向运行;RepeatBehavior="Forever",永远重复播放模式,(注意在不需要的时候尽快停止,否则可能会导致计算机无法进入省电模式),="5x"表示重复5次;
    除了DoubleAnimation外,还有很多其他动画,均从TimeLine类继承,均有的属性AutoReverseRepeatBehaviorDurationBeginTime(延迟播放)和Completed事件(播放完成)等。
        指定EasingFunction属性可以设定动画的欢动曲线,BounceEase什么的,详情去搜索 “Silverlight的Easing”
    2、转换(Transition)
    (1)在StackPanel中动态的添加本地时间
       <1>在MainPage.xaml中设计:

    <StackPanel Name="sp1" HorizontalAlignment="Left" Height="372" Margin="536,143,0,0" VerticalAlignment="Top" Width="360">
                <StackPanel.ChildrenTransitions>
                    <TransitionCollection>
                        <EntranceThemeTransition></EntranceThemeTransition>    //这里是重点,在添加的时候增加的效果,可以变换很多种的效果,自己试吧
                    </TransitionCollection>
                </StackPanel.ChildrenTransitions>
            </StackPanel>
            <Button Content="添加" HorizontalAlignment="Left" Margin="1048,168,0,0" VerticalAlignment="Top" Height="82" Width="188" Click="Button_Click_2" />

       <2>在Click事件中添加:

     Button btn = new Button();
     btn.Content = DateTime.Now;
     sp1.Children.Add(btn);

    (2)改变StackPanel本身的变化效果:

      <Page.Transitions>
             <TransitionCollection>
                 <EntranceThemeTransition></EntranceThemeTransition>
             </TransitionCollection>
      </Page.Transitions> 

       ok,运行下,添加本地时间的时候,可以观看它的效果,比原本直接添加的效果要好很多的。

    二、异步编程

         异步编程可以避免界面很卡的问题,但会导致编写“等待一个异步操作执行完成再执行一段代码”的程序。在方法中如果有一个地方用到了await,则方法需要标注为asyn。一般异步方法都是以Async结尾,一步方法都可以使用await编程(好像是同步的,其实不是),异步执行结束后才继续详细执行,返回值中有执行结果。
    在win8系统里面很多API都封装成了异步的形式,就是说微软把可能浪费时间的全部都只提供一个异步,其实异步用着和同步感觉没什么太大的差别。win8的异步编程大量的使用了Lambda表达式(详细情况查询MSDN吧)。
    需要调用异步,Windows运行时API的常见任务为:
              @显示消息对话框(MessageDialog
              @使用文件系统(IO操作)
              @向Internet发送数据和从Internet接受数据(HttpClient)
    当然编程语言不通,支持异步的模式也不同:
             JS的异步表示形式:承诺对象,then函数
             C#的异步表示形式:将来对象,await运算符
             Basic的异步表示形式:将来对象,Await运算符
             C++的异步表示形式:task类,then方法
    C#中的await:
    用awit编译器把后面的代码自动创建一个委托然后把后面的代码放到Completed里面,然后好像是同步,并把返回的结果放到result执行后的结果里,这样写起来类似同步其实是异步调用

    1、显示消息对话框(MessageDialog)

       在前面的博客中已经写过了,请参考 http://www.cnblogs.com/kefira/archive/2013/03/07/windows8.html 中的12、消息框(MessageDialog)

    2、使用文件系统(IO操作)
       Package.Current.InstalledLocation来获得程序的安装文件夹,GetFolderAsyncGetFilesAsync遍历文件夹。
    例子:读取Image文件夹下的所有图片到FlipView中。
    (1)在MainPage.xaml中设置:

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <Button x:Name="AddBtn" Content="添加" HorizontalAlignment="Left" Margin="93,78,0,0" VerticalAlignment="Top" Height="83" Width="230" Click="AddBtn_Click_1"   />
            <FlipView x:Name="fvImage" HorizontalAlignment="Left" Margin="438,138,0,0" VerticalAlignment="Top" Width="556" Height="483">
                <FlipView.ItemTemplate>
                    <DataTemplate>
                        <Image Source="{Binding}"></Image>
                    </DataTemplate>
                </FlipView.ItemTemplate>
            </FlipView>
        </Grid>

    (2)后台代码实现:

    StorageFolder的命名空间:using Windows.Storage; Package的命名空间:using Windows.ApplicationModel;

      StorageFolder installFolder = Package.Current.InstalledLocation; //获得程序的安装路径
                 var imgFolder= await installFolder.GetFolderAsync("Images"); //别忘了加await
                 var files = await imgFolder.GetFilesAsync();
                 List<string> myList = new List<string>();
                 foreach (var file in files)
                 {
                    string path="ms-appx:///Images/"+ file.Name;
                    myList.Add(path);
                 }
                 fvImage.ItemsSource = myList;

    运行结果(点击Button时将图片添加到FlipView中)如图:   (附加一句:我超喜欢柯南的呢)

    3、向Internet发送数据和从Internet接受数据(HttpClient)
      例子:获取百度首页的源码
    HttpClient 所属命名空间:using System.Net.Http; MessageDialog 所属命名空间:using Windows.UI.Popups;

     HttpClient httpClient = new HttpClient();
     var result = await httpClient.GetStringAsync("http://www.baidu.com/index.php?tn=85014098_adr&ch=33");
     new MessageDialog(result).ShowAsync();

        运行结果就是在页面上显示出了百度首页的源码
    分析:假如使用的是同步方法,UI会卡住一直等到网络请求完成之后才会释放掉UI的线程。

    -- 后记:这节是win8中的动画和异步编程的简单学习(当然需要深入的学习),依旧来自于传智播客视频的学习,分享给同样爱好win8的朋友们!@_@

  • 相关阅读:
    jQuery 核心
    Visual Studio 文件没发布出来
    冷门JS技巧
    项目发布: error CS0103: 当前上下文中不存在名称“*****”
    jQuery编程的最佳实践
    HTML5中类jQuery选择器querySelector的使用
    html dl dt dd标签元素语法结构与使用
    EF Code First 更新数据库, 数据库迁移
    ASP.NET MVC中的拦截器
    C#Linq中的Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods,skip,take,takewhile,skipwhile,编译查询等
  • 原文地址:https://www.cnblogs.com/kefira/p/win8_3.html
Copyright © 2020-2023  润新知