MediaCenter开发整理(二)MCML

来源:互联网 发布:八面玲珑 知乎 编辑:程序博客网 时间:2024/05/17 03:29

接着贴下个部分

MediaCenter编程MCML

 

Media Center不能做的事:

不能改变已有的程序界面——mediacenter不是用户定制的环境!

不能使用已经存在的Object——只有3个可用的ObjectTextGraphicsColorFills其他的只能从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内可以是可见元素TextGraphicsColorFills

       也可以是容器元素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” 边界渐变方向

 

ScrollersRepeater

 

 

公共属性

       几乎所有元素都具有的

       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 默认值为DefaultString

       默认值设为”$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的函数,是链接.netMCML的关键

名叫MyNetObjectObjcet有一个函数为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可以捕捉到 HandlerInvoked属性改变

 

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  淡出效果

可以在RulesAction节点中使用PlayAnimation

也可以设置为触发播放,Object的莫个属性改变时,动画开始播放

触发条件如下

Alpha visible的改变不会触发

ContentChangeHide

ContentChangeShow

GainFocus

Hide

Idle没有动画播放,则这个动画将循环播放

LoseFocus

Move

Rotate

Scale

Show

Size visible的改变触发

 

RelativeTo变化方式  变化后的状态 回到原始状态还是停在当前?

Absolute

Current

Final

 

渐变曲线

SinCosine

指数和对数曲线

Easy Out/In

S-Curve

 

Scrollers & Repeaters 

重要!MediaCenter对电视xbox360等非复杂输入条件的主要支持特点

MediaCenter编程,假定用户都是在310m的距离观看,所以所有的UI都应该是看起来巨大的!所以屏幕中所能容纳的东西其实很少!!所以一个列表的内容基本是不可接受的,于是我们需要Scrollers,它用repeaters   hand-in-hand工作??

                                       

ArrayListDataSet

他没有selected的概念

Choice在他的属性Options里有一个ArrayListDataSet的值

ArrayListDataSet有两个属性ChosenChosenIndex

 

<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并赋值给ButtonLabel

              </Content>

       </Reperater>

</Content>

此时的3button将具有A B C的不同的名字

 

ScrollingHandler应该在Locals里创建

<ScrollingHandler Name=”Sh”/>

值有以下几个

HandlerDirectionalKeys

HandlerHomeEndKeys

HandlerMouseWheel

HandlerPageCommands

HandlerPageKeys

 

HandlerStage

它也有 ScrollingDataObject

Scroller不包含所有信息  所以需要保持在一个局部变量里 就是ScrollingData

<ScrollingData Name=”SD”/>

 

BeginPadding/EndPadding

在这之间的区域将是焦点显示的区域   非焦点将被排除在区域之外

<ScrollingDate Name=”SD” BeginPadding=”100”EndPadding=”100”/>

 

 

 

 

LockedPosition/LockedAlignment

LockedPosition把焦点固定在屏幕的某个地方,焦点改变时,Scroller位置改变,焦点位置不变

LockedAlignment指定固定焦点的哪个部分,默认是near

ScrollingHandler负责捕捉所有事件,ScrollingDate存有它的引用,并赋值在ScrollingHandlerScroller之间通信

建立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>

 

连接ScrollerScrollingData

<Scroller Name=”MyScroller” ScrollingData=”[SD]”/>

 

连接ScrollingDataScrollingHandler

<Rules>

       <DefaultTarget=”[SH.ScrollingData]” Value=”[SD]”/>

</Rules>

 

连接ScrollingDataRepeater

<Rules>

       <DefaultTarget=”[SD.Repeater]” Value=”[MyReperter]”/>

</Rules>

UI之间的通信

每个UI都不能访问其他UILocals  Properties Content就是说每个UI都是一个完全封闭的世界

唯一通信的途径就是Property也就是前面的$Required的方式

所以UI间通信,UI之间必须有一个共享的 Property

一些情况下,可以多个UI共同继承同一个父UI

也可以把这些共享的Object放在C#部分

 

介绍了一个不能得到预期结果的例子  狗日的

 

ModelItem

Media center .net命名空间里的一个类   mediacenter 工作的一个基础

他有一个重要的属性FirePropertyChanged通知media center属性的改变

所有依赖它的rules都做出反应

 

 

原创粉丝点击