Silverlight For WinEmbedded 的页面切换实现

本文章的基础是:新建 WinCE7.0 下的 Silverlight 工程(http://www.cnblogs.com/91program/p/5201231.html)

前一段时间在研究 Silverlight 应用在 Windows Embdeed 下的使用。还在 Silverlight 论坛发帖子求助页面切换的问题,最后没有答案(帖子见:http://bbs.csdn.net/topics/390832361)。
在 Windows Embedded 下只能使用 C++ 配合 Silverlight 使用,但在 PC 上一般使用的是 C#,包括 Windows Phone 的开发,前期也只支持 C#。从 Windows Phone 8.1 开发,好像是支持 C++了。但这方面的资料太少!
建立一个基于 C++ 的 Silverlight 工程,还是比较麻烦的。特别是对 XAML 的处理,一般建议是在 Microsoft Expression Blend 3 中完成。
在安装 Silverlight for Windows Embedded 后,在新建项目中会多一个模板:Silverlight for Winodws Embedded Application,可以使用这个模板来创建基于 Silverlight 的应用。按向导一步步执行,最关键的一步是选择使用 Blend 创建的包含 XAML 的工程和默认的启动页面。
创建成功的 Demo,偶已经上传到 CSDN 下载频道。下载地址如下:http://download.csdn.net/detail/91program/7745251
页面切换的方法是以 MainPage 中的 Grid 为基础,在 Grid 中载入其它的 xaml 资源。即先显示 MainPage页面(一般为有一个或多个 Grid 的空页面),然后根据加载条件,载入不同的页面。

关键的代码和 XAML 如下:
1. MainPage.cpp

 1 HRESULT MainPage::InitializeComponent()
 2 {
 3   HRESULT hr = E_FAIL;
 4   m_clickDelegate = NULL;
 5
 6
 7   FindName(L"LayoutRoot", &m_pLayoutRoot);
 8   FindName(L"Gird_Layer_Source", &m_pGird_Layer_Source);
 9
10
11   if (m_pLayoutRoot && m_pGird_Layer_Source)
12   {
13     hr = S_OK;
14   }
15
16
17   return hr;
18 }  

2.MainPage.xaml

<UserControl
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:WinEmbeddedHelloWorld"
  x:Class="WinEmbeddedHelloWorld.MainPage"
  Width="800" Height="480">  

  <Grid x:Name="LayoutRoot" Background="Black">  

    <Grid x:Name="Gird_Layer_Source" Margin="0,0,0,0">
    </Grid>  

  </Grid>
</UserControl>  

3. App.cpp 
1) 页面注册

 1 HRESULT App::RegisterUserControls()
 2 {
 3     HRESULT hr = S_OK;
 4
 5
 6     static PFN_XRCUC_REGISTER pfn[] =
 7     {
 8         &MainPage::Register,
 9         &SecondPage::Register,
10     };
11
12
13     for (int i=0; i<_countof(pfn) && SUCCEEDED(hr); i++)
14     {
15         hr = pfn[i]();
16
17
18         if (FAILED(hr))
19         {
20             RETAILMSG(1,(L"RegisterUserControls failed."));
21         }
22
23
24     }
25
26     return hr;
27 } // RegisterUserControls  

4. App.cpp 页面切换功能的实现
1) 全局变量

1 IXRGridPtr gpMainLayer = NULL;  

2) 赋值

 1 HRESULT App::CreateHost(XRWindowCreateParams* pCreateParams)
 2 {
 3   XRPtr<IXRCustomUserControl>  pControl;
 4   HRESULT hr = E_FAIL;
 5
 6
 7   hr = m_pApplication->CreateObject(__uuidof(MainPage),&pControl);
 8   if (SUCCEEDED(hr))
 9   {
10     hr = m_pApplication->CreateHostFromElementTree(pControl, pCreateParams, &m_pVisualHost);
11   }
12
13
14   IXRApplication *pApp = NULL;
15   App::GetApplication(&pApp);
16   IXRCustomUserControl *p1 = (IXRCustomUserControl *)pControl;
17   MainPage *pMainPage = dynamic_cast<MainPage *>(p1);
18   gpMainLayer = pMainPage->m_pGird_Layer_Source;         // 记录显示的基础 Grid
19   pMainPage = NULL;
20
21
22   return hr;
23 }  

3) 测试页面切换

  1. HRESULT App::OnStartup()
  2. {
  3. HRESULT hr = S_OK;
  4. IXRFrameworkElementPtr pRoot;
  5. hr = m_pVisualHost->GetRootElement(&pRoot);
  6. if (SUCCEEDED(hr))
  7. {
  8. // TODO: Add one time initialization code here.
  9. }
  10. // Leo 测试页面显示, 即页面切换(从 MainPage 切换到 SecondPage)
  11. if(NULL != gpMainLayer)
  12. {
  13. XRPtr<SecondPage> pSwitchPage = NULL;
  14. IXRUIElementCollection *pChildList = NULL;
  15. gpMainLayer->GetChildren(&pChildList);
  16. if(NULL == pChildList)
  17. {
  18. return NULL;
  19. }
  20. {
  21. HRESULT hr = m_pApplication->CreateObject(__uuidof(SecondPage),&pSwitchPage);
  22. if(SUCCEEDED(hr) && NULL != pSwitchPage)
  23. {
  24. // pSwitchPage->OnLoad();
  25. pChildList->Add(pSwitchPage,NULL);
  26. }
  27. }
  28. }
  29. return hr;
  30. } // OnStartup

5 SecondPage.xaml

<UserControl
  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"
  x:Class="WinEmbeddedHelloWorld.SecondPage"
  d:DesignWidth="640" d:DesignHeight="480" Width="800">  

  <Grid x:Name="LayoutRoot" Background="Green">
    <Button Height="38" HorizontalAlignment="Left" Margin="65,54,0,0" VerticalAlignment="Top" Width="177" Content="Second Page"/>
    <Button Height="38" HorizontalAlignment="Left" Margin="65,117,0,0" VerticalAlignment="Top" Width="177" Content="Origin Prj"/>
  </Grid>  

</UserControl>  
时间: 2024-08-09 10:43:43

Silverlight For WinEmbedded 的页面切换实现的相关文章

在uwp仿IOS的页面切换效果

有时候我们需要编写一些迎合IOS用户使用习惯的uwp应用,我在这里整理一下仿IOS页面切换效果的代码. 先分析IOS的页面切换.用户使用左右滑动方式进行前进和后退,播放类似于FlipView的切换动画.导航到新页面时,使用页面前进的动画. UWP自带很多切换效果,位于 Windows.UI.Xaml.Media.Animation 中.与苹果的切换效果最接近的是 PaneThemeTransition (而不是EdgeUIThemeTransition). PaneThemeTransition

Android使用Fragment打造万能页面切换框架

首先我们来回忆一下传统用Activity进行的页面切换,activity之间切换,首先需要新建intent对象,给该对象设置一些必须的参数,然后调用startActivity方法进行页面跳转.如果需要activity返回结果,则调用startActivityForResult方法,在onActivityResult方法中获得返回结果.此外,每一个要展示的activity需要在AndroidManifest.xml文件中注册.而且,如果在某些特定的情况下(比如65536方法数爆炸)要动态加载dex

利用pushState开发无刷页面切换

利用pushState开发无刷页面切换<转> 相关文档:https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulatingthebrowser_history 实现目标 页面的跳转(前进后退,点击等)不重新请求页面 页面URL与页面展现内容一致(符合人们对传统网页的认识) 在不支持的浏览器下降级成传统网页的方式 使用到的API history.state 当前URL下对应的状态信息.如果当前URL不是通过pushSta

用Fragment实现Tab页面切换效果初步总结

前言: 最近在Android项目中需要在活动中实现多页面切换的功能,第一次是实现的过程中,是让Activity同时去加载三个界面的,通过点击tab按钮对页面设置隐藏和显示,实现页面切换效果,但是后面发现这种实现方式其实存在很多问题: 首先,同时去加载三个页面,切换Activity的速度会变慢,尤其是布局中如果有很多ImageView,ImageButton等使用到图片资源的控件时,切换效果非常不好: 其次,由于使用了很多图片资源,在退出Activity的时候,像Drawable,Bitmap等一

activity切换动画和页面切换动画

Activity切换动画 要实现Activity切换动画需要靠overridePendingTransition来实现,里面有两个参数分别是进入Activity时的动画和离开Activity时的动画. 需要注意的是必须在StartActivity()或finish()之后立即调用 比如在MainActivity中有一个Button,点击Button后跳转到OtherActivity中代码如下: Intent intent = new Intent(this, OtherActivity.clas

Android5.0之后的页面切换动画

Android5.0之后给我们开发者剩了好多的事情,为什么这么说呢?还记得刚开始的时候,Android里面的所有的动画都要我们开发者自己来写,现在不需要了,因为5.0之后自带了好多的动画,比如:按钮点击的动画.页面切换的动画(在android5.0之前想都不敢想的). 今天我着重讲一下页面之间的切换,目前5.0系统自带了三种动画方式:Explode(缩放).Fade(淡入淡出).Slide(滑动进入).下面就这三中方式进行介绍一下. 在讲解之前,现对于动画的方式进行介绍一下.通常,我们进行页面跳

vue-lazy-render: 延迟渲染大组件,增强页面切换流畅度

最近用element来做项目,在开发的过程中,突然发现页面的操作和切换在数据量大的时候相当卡,后来提了个issue,在furybean解答后才知道,我每个单元格都加了tooltip,会生成大量的节点,造成页面操作卡顿.后来将tooltip去掉,操作流畅多了. 但是,由于我是将页面的数据存在vuex中的,在路由切换回来的时候,发现在数据量大的时候,页面渲染得很慢,大概两三秒才能切换过来,用户体验相当不好. 这时,我就在想,能不能让页面切换完成之后才开始渲染数据量大的组件,用户起码不会感知到路由切换

ViewPager之Fragment页面切换

一.概述 ViewPager是android-support-v4中提供的类,它是一个容器类,常用于页面之间的切换. 继上篇文章<ViewPager之引导页>之后,本文主要介绍ViewPager更为通用的实践:ViewPager搭配Fragment实现页面切换. 这种实现方式相对于上篇文章而言,可以更好的支持不同页面各自的复杂逻辑,与此同时,也能够保障页面之间的耦合度尽可能的低. 按照惯例,先晒出效果图:        二.实现思路 首先分析一下不同区域的交互需求: 中间灰色区域除了要支持三套

Android中使用ViewPager实现屏幕页面切换和页面轮播效果

之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpager有自己的adapter,这也让其适应复杂对象,实现数据的动态加载. ViewPager是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而viewpager就是其中之一,利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等. 下面我们就展示下Vie