MediaCenter开发整理(二)MCML
来源:互联网 发布:八面玲珑 知乎 编辑:程序博客网 时间:2024/05/17 03:29
接着贴下个部分
MediaCenter编程MCML
Media Center不能做的事:
不能改变已有的程序界面——mediacenter不是用户定制的环境!
不能使用已经存在的Object——只有3个可用的Object:Text,Graphics,ColorFills其他的只能从0写起!
所有用户界面相关的.netAX等等都不可用!
MCML M(mode) V(view)模式 M——.netObject
<Mcml xmlns=”…”></Mcml> à 头
Xmlns:cor=”assembly://mscorlib/System” ànamespace
<UI Name=”name”></UI> à类似于控件 必须有唯一的名字 有四个元素
<Content></Content>à可视属性 如button
<Properties></Properties>à公有数据成员 如button显示的名字
<Locals></Locals>à私有数据成员 如button的事件句柄 局部变量
<Rules></Rules>à逻辑
Content内可以是可见元素Text,Graphics,ColorFills
也可以是容器元素Panel, Clip, Scrollers
还有一个特殊的元素repeter
可见元素
Text
一行或多行,大部分字体(不是全部)
属性
Content=”Hello World”
Font=”<fontname>,<font size>”
Color=”White” Color=”255,255,255”
Graphic
一张图片bitmap jpeg png
属性
Conten=”resx://assembly/class/name”
AquiringImage=”...”
ErrorImage=”…”
ColorFill
一个矩形填充的区域
Content=”Black” Content=”255,255,255”
容器元素
任何控件都可以是容器,可以包含<Children></Children>子节点
Panel
不可见,子控件越界依然可见,但是可以统一控制子控件行为。
Clip
子控件越界不可见
属性
Orientation=”Vertical” 边界渐变方向
Scrollers和Repeater
公共属性
几乎所有元素都具有的
Visible=”true”可见
Alpha=”0.75”透明度
Scale=”1,0.5,2”拉伸 X Y Z 轴
Rotation=”90deg(3rad),0, 0, 1” 旋转 度数或弧度 旋转轴轴
CenterPointPercent=”0.5,0.5, 0.5” 旋转 拉伸的中心点 比例
CenterPointOffset=”20,20,0”中心点 偏移
Padding=”5,5,5,5”边框
Margins=”5,5,5,5”边距
MaximumSize=”200,200”
MinmumSize=”200,200”
FadeSize=”20”边缘渐变大小
NearOffset=”-20”边缘渐变偏移
Properties
可以从父控件继承,对控件重用至关重要
<cor:StringName=”MyStringProperty” cor:String=”Default”>
创建一个名字叫MyStringProperty 默认值为Default的String
默认值设为”$Required”则必须需要指定值,否则会抛出异常
使用时 可以用”[MyStringProperty]”代表这个String值
Xmlns:me=”Me”
<UINameMyStringProperty=”value”>
Locals
不能被继承,只能自己唯一一个控件使用,其他同Properties,用于事件和与.net交互的数据
例如<Locals><ClickHandlerName=””ClickedMe></Locals>鼠标点击事件
Rules
控件的逻辑,用户操作的界面响应
Set
设置一个MCML或者.net属性的值
Target属性名Value属性值
<Set Target=”[MyText.Color]” Value=”Black”/>
Invoke
调用MCML和.net的函数,是链接.net和MCML的关键
名叫MyNetObject的Objcet有一个函数为MyOwnFunction
可以这样调用<InvokeTarget=”[MyNetObject.MyOwnFunction]”/>
带参数和返回值的.Net函数
Public string MyOwnFunction(string param1, stringparam2)
{
returnparam1+”&”+param2;
}
调用
<cor:String Name=”MyResultValue”>
<Invoke Target=”[MyNetObject.MyOwnFunction]”
param1=”First”
param1=”second”
ResultTarget=”MyResultValue”/>
PlaySound
播放声音,指操作响应一类的段声音,不适合用来播放音乐,声音文件可以被包含在资源文件里
<PlaySound Sound=”[resx://MyAssembly/Resources/Ding]”/>
PlayAnimation
Target播放的Object Animation动画名
<PlauAnimation Animation=”me:FadeOut” Target=”MyText”/>
DebugTrace
调试信息,类似OutPutDeubgString
<DebugTrace Message=”This text appears in ‘output’ ”/>
Navigate
类似于newform? 不懂
<Navigate Source=”pathtothefile”/>
Load一个mcml时,会创建最先加载的UI,此时这个UI即是主Form
在Source里用#加UI name 指定加载这个UI
<Navigate Source=”pathtothefile#BackgroundText”/>
回去加载pathtothefile mcml文件 并用BackgroundText替换先前加载的UI
用途是在多个文件之间传递数据 保持一个不间断的信息链
<Nagivate Source=”res://MyAssembly/Resources/Page2”
ItemToView=”Clothes”/>
Page2文件 有一个 require属性
Rule使用环境
Condition
条件触发
Source条件
SourceValue触发情况
CinditionOp触发情况比较种类
<Condition Source=”[Input.Focus]”
SourceValue=”true”>
<Actions>
<Set Target=”[Base.Color]” value=”White”>
</Actions>
</Condition>
获得焦点,颜色变为白色
Changed
条件改变触发,每次改变触发一次
Source条件
<Changed Source=”[Input.KeyFocus]”>
<Actions>
<PlaySound
Sound=”resx://myassmbly/Resources/sound”/>
</Action>
</Changed>
Default
在UI被创建时触发,类似构造函数或者finallyInit?
<Default Target=”[Input.Interactive]”
Value=”true”/>
不懂!
Binding
绑定到属性上,跟随属性改变而改变
<Binding Source=”[Label]”
Target=”[MyText.Content]”>
实质上就是一个Changed
<Changed Source=”A”>
<Actions>
<SetTarget=”B” value=”A.value”>
</Actions>
</Changed>
Conditions
Condition有一个子节点,可以添加触发条件,即Conditions,包括以下四个条件判断
Equality
Scource Value ConditonOp
其中ConditonOp有以下值
ChangedTo
Equals
GreaterThan
GreaterThanOrEquals
LessThan
GreaterThanOrLess???貌似是错的
NotEquals
IsType
Source Type 检查某元素是否是某个类型
IsVaild
Source 检查某个元素是否有效 !=null
IsModified
Source 检查某个属性与上次检查相比是否改变了
多重判断条件的组合方式 在Condition节点加ConditionLogicalOp属性,值为and或者or
Transformers
对要传入或返回的数据做数学上的改变或者类型上的改变
MathTransformer
Multiply乘
Division除
Addition加
Subtraction减
BooleanTransformer
<Transformer>
<MathTransformerMultiply=”4” Add=”1”>
</Transformer>
乘4再加1 没有优先级???
响应的事件尽量使用keyboard 不用mouse
Handler Classes
ClickHandler
KeyHandler
TypingHandler
ScrollHandler
在Locals中创建
Rules中的Changed可以捕捉到 Handler的Invoked属性改变
ClickHandler
Invoked发生click事件时这个属性值将改变,其值具体是多少不应该被关心
Clicking鼠标或者键盘按下时,其值为true,应该使用上一个属性捕捉时间
KeyHandler
Key按下的键值,只支持一个键值
Modifiers功能键值ShiftAlt Contral Windows None
Invoked click是其值改变
Pressed
Handler的公共属性
HandlerStage
指定事件捕获的级别,有以下值
Direct只有自己可以捕捉,父亲和孩子UI都不能捕捉
Bubbled自己和孩子UI都可以捕捉,最常用
Routed自己和父亲UI可以捕捉
Command
为事件指定一个CommandObject处理此事件,可以以此来用一个Object处理多个事件响应
Locals不可以嵌套Locals
<Locals>
<CommandName=”Combined”/>
<KeyHandlerKey=”D3” Modifier=”Shift” Name=”D3”/>
<KeyHandlerKey=”D” Name=”D”/>
</Locals>
<Rules>
<DefaultTarget=”[D3.Command]” Value=”[Combined]”/>
<DefaultTarger=”[D.Command]” Value=”[Combined]”/>
<Changed Source=”[Combined.Invoked]”>
…
</Changed>
</Rules>
位置和布局
有子元素的元素都可以有明确的布局
Form
HorizontalFlow
VerticalFlow
Anchor
Grid
两种使用布局的方式
内联
<UI Name=”Base” Layout=”Center”>…</UI>
扩展Form
<UI Name=”Base”>
<Layout>
<FlowLayoutOrientation=”Horizontal”
Spacing=”15,15”/>
</Layout>
…
</UI>
Fill
填充满容器,经常用在内联的方式Layout=”Fill”
Center
不会填充满,即不会改变content的尺寸
Flow
直线布局
属性
Orientation布局方向
HorizontalFlow水平
VerticalFlow竖直
Spacing
间距 一对值,其中一个是没有作用的,根据布局方向的不同
Alignment
对齐方式
Near Far Center
Grid
表格布局
Orientation
Rows/Columns
Spacing
ReferenceSize
Major/Minor Alignment
Form
Layout=”Form”
<LayoutInput>
<FormLayoutInputTop=”Parent,0” Bottom=”Parent,0.3”/>
</LayoutInput>
父亲的百分比的相对位置
没有父亲的则按屏幕的百分比
Parent或者 兄弟的名字
动画
关键帧 至少2帧
<Animation Name=”FadeIn”>
<KeyFrames>
…
</KeyFrames>
</Animation>
Alpha
Color
Positon
Rotate
Scale
Size
+KeyFrame 作为其子节点名字
每个子节点有两个属性
Time
Value
<Animation Name=”FadeIn”>
<KeyFrames>
<AlphaKeyFrameTime=”0” Value=”0”/>
<AlphaKeyFrameTime=”0.75” Value=”1”/>
</KeyFrames>
</Animation>
从时间0到时间0.75 透明度从0变到1 淡出效果
可以在Rules的Action节点中使用PlayAnimation
也可以设置为触发播放,当Object的莫个属性改变时,动画开始播放
触发条件如下
Alpha visible的改变不会触发
ContentChangeHide
ContentChangeShow
GainFocus
Hide
Idle没有动画播放,则这个动画将循环播放
LoseFocus
Move
Rotate
Scale
Show
Size visible的改变触发
RelativeTo变化方式 变化后的状态 回到原始状态还是停在当前?
Absolute
Current
Final
渐变曲线
Sin和Cosine
指数和对数曲线
Easy Out/In
S-Curve
Scrollers & Repeaters
重要!MediaCenter对电视xbox360等非复杂输入条件的主要支持特点
MediaCenter编程,假定用户都是在3到10m的距离观看,所以所有的UI都应该是看起来巨大的!所以屏幕中所能容纳的东西其实很少!!所以一个列表的内容基本是不可接受的,于是我们需要Scrollers,它用repeaters hand-in-hand工作??
ArrayListDataSet
他没有selected的概念
Choice在他的属性Options里有一个ArrayListDataSet的值
ArrayListDataSet有两个属性Chosen和ChosenIndex
<Locals>
<ChoiceName=”MyChoice”>
<Options>à应该套上这个?语法报错
<cor:Stringcor:String=”A”/>
<cor:Stringcor:String=”B”/>
<cor:Stringcor:String=”C”/>
</Options>
</Choice>
</Locals>
<Repeater Source=”[MyChoice.Options]”>
<Content>
<me:ButtonLabel=”A”>
</Content>
</Repeater>
现在可以有3个按钮的list 但是每个按钮的名字都是A,用以下两个属性解决
RepeatedItem
RepeatedItemIndex 从0开始
RepeatedItem 是一个Object 可以把它转换为有用的类型
用 ! 标志加类型的名称 如果要转换的类型不是RepeatedItem的类型 将会有一个异常 异常将被抛出到程序之外而不能被捕捉到?!
RepeatedItem应该是一个.net类型
RepeatedItem!cor:String
RepeatedItem!cor:String.Length
等同于(RepeatedItem!cor:String).Length 但是这在mcml里是不合法的语法
<Locals>
<ChoiceName=”MyChoice”> à建立一个Choice
<cor:Stringcor:String=”A”/>
<cor:Stringcor:String=”B”/>
<cor:Stringcor:String=”C”/>
</Choice>
</Locals> à同时建立了一个ArrayListDataSet
<Content>
<Repeater Source=”[MyChoice.Options]”
à用刚建立的ArrayListDataSet填充到Options
Layout=”VertionalFlow”>
<Content>
<me:ButtonLabel=”[RepeatItem!cor:String]”>
à将类型转换为.net中的String并赋值给Button的Label
</Content>
</Reperater>
</Content>
此时的3个button将具有A B C的不同的名字
ScrollingHandler应该在Locals里创建
<ScrollingHandler Name=”Sh”/>
值有以下几个
HandlerDirectionalKeys
HandlerHomeEndKeys
HandlerMouseWheel
HandlerPageCommands
HandlerPageKeys
HandlerStage
它也有 ScrollingData的Object
Scroller不包含所有信息 所以需要保持在一个局部变量里 就是ScrollingData
<ScrollingData Name=”SD”/>
BeginPadding/EndPadding
在这之间的区域将是焦点显示的区域 非焦点将被排除在区域之外
<ScrollingDate Name=”SD” BeginPadding=”100”EndPadding=”100”/>
LockedPosition/LockedAlignment
LockedPosition把焦点固定在屏幕的某个地方,焦点改变时,Scroller位置改变,焦点位置不变
LockedAlignment指定固定焦点的哪个部分,默认是near
ScrollingHandler负责捕捉所有事件,ScrollingDate存有它的引用,并赋值在ScrollingHandler和Scroller之间通信
建立Scroller ScrollingHandler ScrollingData 和对应的Repeater
<Locals>
<ChoiceName=”MyChoice”>
<cor:Stringcor:String=”A”/>
….
<cor:String cor:String=”Z”/>
<Choice>
<ScrollingData Name=”SD”BeginPadding=”100” EndPadding=”100”/>
<ScrollingHandler Name=”SH”/>
</Locals>
<Content>
<ScrollerName=”MyScroller”>
<Content>
<Repeater Source=”[MyChoice.Options]”
Layout=”VerticalFlow”
Name=”MyRepeater”/>
<Content>
<me:Button Label=”[RepeatedItem!cor:String”/>
</Content>
</Repeater>
</Content>
</Scroller>
</Content>
连接Scroller和ScrollingData
<Scroller Name=”MyScroller” ScrollingData=”[SD]”/>
连接ScrollingData和ScrollingHandler
<Rules>
<DefaultTarget=”[SH.ScrollingData]” Value=”[SD]”/>
</Rules>
连接ScrollingData和Repeater
<Rules>
<DefaultTarget=”[SD.Repeater]” Value=”[MyReperter]”/>
</Rules>
UI之间的通信
每个UI都不能访问其他UI的Locals Properties Content就是说每个UI都是一个完全封闭的世界
唯一通信的途径就是Property也就是前面的$Required的方式
所以UI间通信,UI之间必须有一个共享的 Property
一些情况下,可以多个UI共同继承同一个父UI
也可以把这些共享的Object放在C#部分
介绍了一个不能得到预期结果的例子 狗日的
ModelItem
Media center .net命名空间里的一个类 是mediacenter 工作的一个基础
他有一个重要的属性FirePropertyChanged通知media center属性的改变
所有依赖它的rules都做出反应
- MediaCenter开发整理(二)MCML
- MediaCenter开发整理(一)关于SDK
- MediaCenter开发整理(三)C#部分
- MediaCenter开发整理(四)安装部分
- MCML的开发工具和方式
- iPhone开发中的技巧整理(二)
- iPhone开发中的技巧整理(二)
- 什么是MCML?
- 什么是MCML?
- Android开发---RxJava整理《二》
- 基于Skyline的Web程序开发整理(二)
- Android开发——Fragment知识整理(二)
- 阿里巴巴Java开发手册个人整理精简版(二)
- gridview整理(二)
- robotium整理(二)
- robotium整理(二)
- java整理(二)
- sqlalchemy整理(二)
- .net
- 再面试
- MediaCenter开发整理(一)关于SDK
- IE8 javscript上传文件出现 fakepath 的解决方法
- 还面试
- MediaCenter开发整理(二)MCML
- J2ME 字符串切割
- 都不想写下去了,但是还有面试
- Interator and Generator
- CKEditor/FCKEditor 使用-CKeditor 3.0.1 快速教程(含插入图片)
- KQ-100E型电力载波通信模块(载波调制解调模块)
- CKEditor/FCKEditor 使用-集成 CKFinder(上传文件、浏览文件)
- bbossgroups实现多数据库事务
- 还没面上了