MediaCenter开发整理(二)MCML

本文详细介绍了MediaCenter编程中MCML的使用,包括其限制、基本元素、属性、容器、动画效果和事件处理。MCML主要用于定义用户界面,提供了Text、Graphics、ColorFills等元素,并支持容器、动画、逻辑规则等功能。通过MCML,开发者可以创建和控制MediaCenter的UI,但需要注意其特定的限制,如不能直接使用已有.NET对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接着贴下个部分

MediaCenter编程MCML

 

Media Center不能做的事:

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

不能使用已经存在的Object——只有3个可用的ObjectTextGraphicsColorFills其他的只能从0写起!

所有用户界面相关的.net AX等等都不可用!

MCML   M(mode) V(view)模式   M——.net Object

 

<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=”<font name>,<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:String Name=”MyStringProperty” cor:String=”Default”>

       创建一个名字叫MyStringProperty 默认值为DefaultString

       默认值设为”$Required”则必须需要指定值,否则会抛出异常

       使用时  可以用”[MyStringProperty]”代表这个String

              Xmlns:me=”Me”

<UIName MyStringProperty=”value”>

 

Locals

       不能被继承,只能自己唯一一个控件使用,其他同Properties,用于事件和与.net交互的数据

       例如<Locals><ClickHandler Name=””ClickedMe></Locals>鼠标点击事件 

 

Rules

       控件的逻辑,用户操作的界面响应

Set

设置一个MCML或者.net属性的值

Target属性名 Value属性值

<Set Target=”[MyText.Color]” Value=”Black”/>

      

Invoke

调用MCML.net的函数,是链接.netMCML的关键

名叫MyNetObjectObjcet有一个函数为MyOwnFunction

可以这样调用<Invoke Target=”[MyNetObject.MyOwnFunction]”/>

 

带参数和返回值的.Net函数

Public string MyOwnFunction(string param1, string param2)

{

       return param1+”&”+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

类似于new form? 不懂

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

              <Set Target=”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>

       <MathTransformer Multiply=”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功能键值Shift Alt Contral Windows None

Invoked  click是其值改变

Pressed

 

Handler的公共属性

HandlerStage

指定事件捕获的级别,有以下值

Direct只有自己可以捕捉,父亲和孩子UI都不能捕捉

Bubbled自己和孩子UI都可以捕捉,最常用

Routed自己和父亲UI可以捕捉

 

Command

为事件指定一个Command Object处理此事件,可以以此来用一个Object处理多个事件响应

 

Locals不可以嵌套Locals

<Locals>

       <Command Name=”Combined”/>

       <KeyHandler Key=”D3” Modifier=”Shift” Name=”D3”/>

       <KeyHandler Key=”D” Name=”D”/>

</Locals>

<Rules>

       <Default Target=”[D3.Command]” Value=”[Combined]”/>

       <Default Targer=”[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>

              <FlowLayout Orientation=”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>

       <FormLayoutInput Top=”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>

              <AlphaKeyFrame Time=”0” Value=”0”/>

              <AlphaKeyFrame Time=”0.75” Value=”1”/>

</KeyFrames>

</Animation>

从时间0到时间0.75   透明度从0变到淡出效果

可以在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有两个属性Chosen ChosenIndex

 

<Locals>

       <Choice Name=”MyChoice”>

              <Options>à应该套上这个?语法报错

              <cor:String cor:String=”A”/>

              <cor:String cor:String=”B”/>

              <cor:String cor:String=”C”/>

</Options>

       </Choice>

</Locals>

 

<Repeater Source=”[MyChoice.Options]”>

       <Content>

              <me:Button Label=”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>

       <Choice Name=”MyChoice”>  à建立一个Choice

              <cor:String cor:String=”A”/>

              <cor:String cor:String=”B”/>

              <cor:String cor:String=”C”/>

       </Choice>

</Locals>    à同时建立了一个ArrayListDataSet

 

<Content>

       <Repeater    Source=”[MyChoice.Options]” 

à用刚建立的ArrayListDataSet填充到Options

Layout=”VertionalFlow”>

              <Content>

                     <me:Button Label=”[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>

       <Choice Name=”MyChoice”>

              <cor:String cor:String=”A”/>

              ….

<cor:String cor:String=”Z”/>

       <Choice>

      

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

<ScrollingHandler Name=”SH”/>

</Locals>

 

<Content>

       <Scroller Name=”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]”/>

 

连接ScrollingDataScrollingHandler

<Rules>

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

</Rules>

 

连接ScrollingDataRepeater

<Rules>

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

</Rules>

UI之间的通信

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

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

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

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

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

 

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

 

ModelItem

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

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

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

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值