下载此文档

开发框架介绍WP8.docx


文档分类:IT计算机 | 页数:约19页 举报非法文档有奖
1/19
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/19 下载此文档
文档列表 文档介绍
该【开发框架介绍WP8 】是由【wz_198622】上传分享,文档一共【19】页,该文档可以免费在线阅读,需要了解更多关于【开发框架介绍WP8 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。
Caliburn是一套基于XAML的开发框架,它小巧而强大。利用它不但能提高开发效率,还可以提高XAML程序开发的可维护行、可扩展性和可测试性。。
MVVM简介
MVVM源于微软的软件开发架构模式,可以粗略的认为它是MVC模式的发展,原来Controller的职能被拆分,其中值转换器(ValueConverter)和绑定器(binder)已经由框架实现,程序员可以更关注在逻辑实现上。MVVM的开发基于事件驱动,实现UI层和逻辑层的分离,从而使UI设计人员和程序员各施其职。MVVM中的ViewModel在Model和View之间扮演着值转换器的角色,把Model的数据交给View去绑定,把View的数据提交给Model;同时也要实现mediator设计模式,成为View和Model之间的逻辑协调者。

。比如:你无需使用ViewModelLocator为某个View定位它的ViewModel,,就是它的ViewModel的名字,如:MainPage和MainPageViewModel。
。如果ViewModel的属性名和控件的名称相同,那么就会自动绑定上。如果该属性的值发生变化,控件的也能得到更新。
此外,,例如:tombstone的管理,应用程序生命周期和launcher。
当然,你也可以自定义各种约定。
准备工作
下载
,也可以在其官网下载发布包、源代码和例子。
入口bootstrapper
,所有的ViewModel必须在这个类里注册,

如果需要自定义命名约定,也是在这个类里定义。
我们新建一个WP8工程,,创建Views目录,,创建ViewModels目录,,。
在工程的根目录下创建bootstrapper,其内容如下。
publicclassAppBootstrapper:PhoneBootstrapper
{
PhoneContainercontainer;
protectedoverridevoidConfigure()
{
container=newPhoneContainer(RootFrame);
();
//注册所有ViewModel
<MainPageViewModel>();
AddCustomConventions();
}
staticvoidAddCustomConventions()
{
//ellided自定义命名约定
}
protectedoverrideobjectGetInstance(Typeservice,stringkey)
{
(service,key);
}
protectedoverrideIEnumerable<object>GetAllInstances(Typeservice)
{
(service);
}
protectedoverridevoidBuildUp(objectinstance)
{
(instance);
}
}
初始化bootstrapper
,初始化bootstrapper。
<Application
x:Class=""
xmlns=""
xmlns:x=""
xmlns:phone="clr-namespace:;assembly="
xmlns:shell="clr-namespace:;assembly="
xmlns:local="clr-namespace:">
<!--ApplicationResources-->
<>
<local:AppBootstrapperx:Key="bootstrapper"/>
</>
</Application>
,默认的初始化代码已经不需要了。
publicpartialclassApp:Application
{
publicApp()
{
InitializeComponent();
}
}
命名约定(namingconvention)
,如果我们运行工程,浏览MainPage页面,则MainPageViewModel自动被实例化。
,看它是如何在View和ViewModel之间传递和转换值,以便View绑定这些值。
我们在ViewModel里增加一个叫Name的属性(Property)。
publicclassMainPageViewModel:PropertyChangedBase
{
publicMainPageViewModel()
{
Name="Matteo";
}
privatestringname;
publicstringName
{
get{returnname;}
set
{
name=value;
NotifyOfPropertyChange(()=>Name);
}
}
}
在View里增加一个文本控件,使用和这个属性相同的名字,值就会自动绑定上去。()
<TextBlockx:Name="Name"/>
注意,ViewModel继承了PropertyChangedBase类,在Name属性被修改的时候,调用NotifyOfPropertyChange方法发出通知,这使得Name属性被修改时,View里的绑定控件
TextBlock能自动地更新。
行为(Actions)
命令(Commands)
,使得ViewModel响应View的事件。它很简单。
View控件定义了名字。
<ButtonContent="Showname"x:Name="ShowNameAction"/>
ViewModel的方法只要使用相同名字就会得到调用。
publicvoidShowNameAction()
{
("Clicked");
}
当然,也支持自定义调用方法。需先引用
xmlns:i=”clrnamespace:;assembly=”xmlns:cal=”clr-namespace:;assembly=”
View里这样定义
<Buttonx:Name="ShowName">
<i:>
<i:EventTriggerEventName="Click">
<cal:ActionMessageMethodName="ShowNameAction"/>
</i:EventTrigger>
</i:>
</Button>
,但Blend不支持。,在Event和Action关键字后使用你想要的事件名和方法名。
<Buttoncal:="[EventClick]=[ActionShowName]"/>
控制行为
,如果一个控件绑定在一个属性上,则另一个属性能很容易控制它的命令能否被执行,只需要这个新属性的名字是那个绑定属性的名字加上Can关键字。例如:一个Button的名字和ViewModel的属性名字叫Execute,则ViewModel里叫CanExecute的属性能控制该Button能否被点击。
还有更复杂一点的情况,一个控件控制另一个控件能否被执行。例如:CheckBox控制Button能否被激活。
<StackPanel>
<Buttonx:Name="ShowName"Content="Clickme"/>
<CheckBoxx:Name="IsEnabled"Content="IsEnabled"/>
</StackPanel>
CheckBox绑定到isEnabled,Button绑定到ShowName,CheckBox值改变的同时通知Button的控制属性
CanShowName,从而实现关联控制。
publicclassMainPageViewModel:PropertyChangedBase
{
privateboolisEnabled;
publicboolIsEnabled
{
get{returnisEnabled;}
set
{
isEnabled=value;
NotifyOfPropertyChange(()=>IsEnabled);
NotifyOfPropertyChange(()=>CanShowName);
}
}
publicboolCanShowName
{
get{returnIsEnabled;}
}
publicvoidShowName()
{
("Clicked");
}
}
集合(Collections)
View的列表控件和ViewModel的集合属性如果同名也能实现绑定,Selected关键字前缀加上属性名的单数形式就能实现选中控制。
例如:ListBox控件使用复数形式的Items名称
<ListBoxx:Name="Items">
<>
<DataTemplate>
<StackPanel>
<TextBlockText="{Binding}"/>
</StackPanel>
</DataTemplate>
</>
</ListBox>
ViewModel的属性同名Items实现绑定。
privateObservableCollection<string>items;
publicObservableCollection<string>Items
{
get{returnitems;}
set
{
items=value;
NotifyOfPropertyChange(()=>Items);
}
}
SelectedItem实现选中控制。(注意:Selected+单数形式Item)
privatestringselectedItem;
publicstringSelectedItem
{
get{returnselectedItem;}
set
{
selectedItem=value;
NotifyOfPropertyChange(()=>SelectedItem);
(value);
}
}
依赖注入(DependencyInjection)
。用户类要在依赖注入时被使用到,就要在Bootstrapper的Configure函数向依赖注入容器注册,,也提供单一实例模式。。
protectedoverridevoidConfigure()
{
container=newPhoneContainer(RootFrame);
();
//注册,非单一实例模式
<MainPageViewModel>();
<Page2ViewModel>();
//注册单一实例模式
<IVisitDataProvider,VisitDataProvider>();
AddCustomConventions();
}
在ViewModel被实例化时,如果其构造函数带有某种类型的接口,则依赖注入容器会提供它们的实例。例子如下。
导航(Navigation)
WindowsPhone使用NavigationService来完成页面间跳转,ViewModel如果要跳转页面,应利用依赖注入得到它的实例。
publicclassMainPageViewModel:PropertyChangedBase
{
privatereadonlyINavigationServicenavigationService;
publicMainPageViewModel(INavigationServicenavigationService)
{
=navigationService;
}
publicvoidGoToPage2()
{
<Page2ViewModel>()
.Navigate();
}
}
注入导航参数
如果导航时带有参数,。
例如:跳转时带上Name参数
publicvoidGoToPage2()
{
<Page2ViewModel>()
.WithParam(x=>,"Matteo")
.Navigate();
}
其导航字符串为/?Name=Matteo,则Page2的同名属性Name在实例化时就会被注入值。如果有控件绑定了该属性,则导航到该页面时就能显示出值。
publicclassPage2ViewModel:PropertyChangedBase
{
privatestringname;
publicstringName
{
get{returnname;}
set
{
name=value;
NotifyOfPropertyChange(()=>Name);
}
}
}
墓碑(Tombstoning)
应用程序被切换至后台时,如果有值需要暂存,,这比普通XAML程序处理生命周期里各个事件要容易的多。我们只需要创建一个StorageHandler<T>的继承类,T是你要保存临时值的ViewModel。
例如,在程序切换至后台时,暂存MainPageViewModel的Name属性。
publicclassMainPageModelStorage:StorageHandler<MainPageViewModel>
{
publicoverridevoidConfigure()
{
Property(x=>)
.InPhoneState();
}
}
InPhoneState()函数把值暂存在内存中,程序退出后就不存在。相对应的InAppSettings()则会持久保存。
深度链接(DeepLinks)
Windowsphone支持跳过首页的实例化,通过URL链接直接打开应用程序里的某个页面,并可携带参数。。
例如:
<StackPanel>
<TextBoxText="{BindingName}"/>
<ButtonContent="Createsecondarytile"x:Name="CreateTile"/>
</StackPanel>
该ViewModel的按钮事件动态创建一个Tile,点击该Tile打开深度链接,这里的链接使用了首页。
publicclassMainPageViewModel:PropertyChangedBase
{
privatestringname;
publicstringName
{
get{returnname;}
set
{
name=value;
NotifyOfPropertyChange(()=>Name);
}
}
publicvoidCreateTile()
{
ShellTileDatatile=newStandardTileData
{
Title="Test",
};
(newUri("/Views/?Name=Matteo",
),tile);
}
}
生命周期的事件
ViewModel并非WP8页面的继承类,为了能在ViewModel里响应PhoneApplicationPage生命周期的事件,。
publicclassMainPageViewModel:Screen
{
protectedoverridevoidOnViewAttached(objectview,objectcontext)
{
(view,context);
("OnViewAttached:ViewModel和View建立关联时被调用");
}
protectedoverridevoidOnInitialize()
{
();
("OnInitialize:初始化结束");
}
protectedoverridevoidOnViewReady(objectview)
{
(view);
("OnViewReady:初始化结束,准备绘制");
}
protectedoverridevoidOnViewLoaded(objectview)
{
(view);
("OnViewLoaded:页面和子控件全部初始化完成");
}
protectedoverridevoidOnActivate()
{
();
("OnActivate:切换成为当前窗口");
}
protectedoverridevoidOnDeactivate(boolclose)
{
(close);
("OnDeactivate:切换至后台");
}
}
Screen的OnActivate和OnDeactivate事件是最常使用的事件,它们分别对应了页面OnNavigatedTo和OnNavigatedFrom事件。值得注意的是,ViewModel加载数据应尽量避免在构造函数和初始化函数中实行,而应该在OnActivate中。
消息传递(Messaging)

例子:从页面1打开页面2,点击页面2的SendMessageButton向页面1发送一个消息,回退到页面1就会看到这个值显示在文本框里。
如下定义的消息类
publicclassSampleMessage
{
publicstringName{get;set;}
publicSampleMessage(stringname)
{
Name=name;
}
}
消息接收者需要实现接口IHandle<T>,本例T就是SampleMessage,并需要接受消息接口IEventAggregator的注入。
注意:消息接收者需要调用IEventAggregator的Subscribe函数订阅消息。
publicclassMainPageViewModel:Screen,IHandle<SampleMessage>
{
privatereadonlyIEventAggregatoreventAggregator;
privatereadonlyINavigationServicenavigationService;
privatestringname;
publicstringName
{
get{returnname;}
set
{
name=value;
NotifyOfPropertyChange(()=>Name);
}
}
publicMainPageViewModel(IEventAggregatoreventAggregator,INavigationService
navigationService)
{
=eventAggregator;
=navigationService;
(this);
}
publicvoidGoToPage2()
{
<SecondPageViewModel>().Navigate();
}
publicvoidHandle(SampleMessagemessage)

开发框架介绍WP8 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数19
  • 收藏数0 收藏
  • 顶次数0
  • 上传人wz_198622
  • 文件大小23 KB
  • 时间2022-10-25