Windows Presentation Foundation Windows Media Center 承载的应用程序概述
更新:2007 年 11 月
Microsoft Windows Media Center (WMC) 是一款数字媒体娱乐应用程序,它随 Windows Vista Home Premium Edition、Windows Vista Ultimate 以及 Microsoft Windows XP Media Center Edition 2005 一起安装。借助 WMC,用户可以管理和使用各种媒体,包括电视(数字和高清晰度)、DVD、音乐、视频、无线电和照片。
无需任何定制,WMC个人计算机 (PC) 即可用于查看和播放数字媒体。这称作 2 英尺用户体验,因为用户使用鼠标、键盘和监视器在 PC 操作 WMC。
但是,可以将 WMCPC 配置为支持远程控制或远程键盘输入。这样一来,用户不必坐在 WMCPC 旁即可对其执行操作。这称作 10 英尺用户体验,适用于包括大型监视器和传统家庭娱乐硬件(例如电视和音响系统)的 WMC 配置。
WMC 提供的核心功能包括一组用于管理和播放数字媒体的应用程序。但是,您可以使用 WPF 为 WMC 的 Windows Vista 版本创建自己的自定义应用程序。
本主题提供了对 WMC 的 WPF 应用程序的发展的介绍,涵盖以下内容:
生成和部署简单的 WPF 游戏应用程序。
面向 2 英尺和 10 英尺 WMC 用户体验。
自定义 WPF 控件以支持 WMC。
使用针对 WPF 的新型 WMC 特定控件。
利用 .NET Framework 中的支持。
通过托管 API 与 WMC 集成。
使用 Visual Studio 2005 增强开发过程。
有关开发 WMC 应用程序的综合信息,请参见 Windows Media Center 软件开发工具包 (WMC SDK)。
本主题包括下列各节。
- 在 WMC 中承载 WPF 应用程序
- 启动适用于 WMC 的 WPF 应用程序
- WMC 用户体验
- 更新 WMC 上的 WPF 控件
- WMC 的其他 WPF 控件
- 使用 .NET Framework 3.0 类库
- 与 WMC 托管 API 集成
- 使用 Visual Studio 开发
- 为 WMC 安装 WPF 应用程序
- 相关主题
在 WMC 中承载 WPF 应用程序
借助 WPF,可以开发两种类型的应用程序:独立应用程序和浏览器承载的应用程序。独立应用程序可提供其各自的窗口和对话框来承载应用程序内容。浏览器承载的应用程序有两种类型,即松散的 XAML 应用程序和 XBAP 应用程序,这两种应用程序都由 Internet Explorer 7 承载。但是,Internet Explorer 7 并不了解有关 WPF 的信息;若要使 Internet Explorer 7 能够承载 WPF 内容,WPF 可为 Internet Explorer 这样的应用程序提供承载代理。此代理可代表其他应用程序承载 WPF 内容,它是使用相同的通用 Windows 基础结构构建而成的,在该基础结构中,Internet Explorer 本身了解如何承载。
WMC 同样能够承载此代理,因此,也可承载 WPF 浏览器承载的应用程序。换言之,您通常可利用 WPF 应用程序开发平台,并可在特定情况下利用浏览器承载的应用程序的导航和安全功能。
本主题的其余部分以 针对 WMC 的 WordGame! 应用程序为例(请参见WordGame!Windows Media Center 演示)。
启动适用于 WMC 的 WPF 应用程序
WordGame! 应用程序包含以下三个文件(所有 XBAP 中的最小数量):
wordgamewmc.exe。XBAP。
wordgamewmc.exe.manifest. ClickOnce 应用程序清单。
wordgamewmc.xbap. ClickOnce 部署清单。
XBAP 是使用 ClickOnce(它要求使用应用程序清单和部署清单文件配置应用程序)启动的,请参见生成 WPF 应用程序 (WPF)。尤其是,XBAP 将在浏览或双击其 .xbap 文件时启动。一旦启动,ClickOnce 的默认行为是代表 WPF 下载应用程序,然后 WPF 将启动 Internet Explorer 并将其导航到应用程序,如下图所示:
若要启动 WMC 应用程序,用户需要浏览或单击 WMC 链接文件 (.mcl)。.mcl 文件是一个 XML 配置文件,该文件在 Windows 中配置为可在浏览或双击时由 WMC 主机 (ehshell.exe) 打开(请参见 WMC SDK)。
![]() |
---|
.mcl 文件在开发过程中便于使用,但我们建议您不要将其设置为安装和启动 WMC 应用程序的机制。请参见为 WMC 安装 WPF 应用程序。 |
打开 .mcl 文件时,WMC 主机将解析并处理 .mcl 文件中包含的配置说明,其中最重要的部分是要打开的应用程序的名称。使用此机制创建一个配置为启动 XBAP 的 .mcl 文件。
<application url="https://localhost/wordgamewmc/wordgamewmc.xbap" />
WMC 主机处理此 .mcl 文件时,WMC 主机将导航到 .xbap 文件。这导致 ClickOnce 在 WMC 主机自身中启动应用程序,如下图所示:
![]() |
---|
如果您希望 WMC 承载松散的 XAML 应用程序,可以使用 .xaml 文件配置 .mcl 文件,如下所示: |
<application
url="https://localhost/loosexamlapplication/loosexamlpage.xaml" />
XBAP 自身无需任何更改,只需附加一个配置文件,WPF 浏览器承载的应用程序即可按照原样由 WMC 承载。
但是,WMC 用户的体验是极为特定的,考虑到一致性和样式,XBAPWMC 应用程序应设计为与 WMC 用户体验相集成。本主题的其余部分涵盖了 WMC 用户体验以及如何生成 XBAP 以便其能够识别用户体验的关键方面。
WMC 用户体验
提供持续的用户体验是任何应用程序开发的核心部分。对于 WMC 用户,应用程序应力图在以下方面保持一致:
主题。应用程序用户界面的整体样式。
布局。控件位置和大小。
导航。使用键盘、鼠标和遥控器在应用程序用户界面中导航。
您可在 WMC SDK 中找到有关 WMC 用户体验的详细讨论,以下主题是对该用户体验的高度概述。
主题
由下图您可看出,WMC 主题具有几个鲜明的特点:
其中最鲜明的特点是其蓝色玻璃状背景和大号亮色圆体字。其结果是创建一个无论对于正在监视器前面的 2 英尺用户、还是可能距离电视很远的 10 英尺用户而言,都能轻松识别的外观。WPF 应用程序应遵循此有关外观的通用方法,WMC 不会在本机公布此信息以供 WPF 应用程序使用。幸运的是,WPF 不提供关于样式设置和主题设置的丰富基础结构,如果需要,可以利用该基础结构轻松地复制 WMC 外观。或者,尽管应始终考虑布局和导航,您也可使用 WPF 创建外观丰富的全新用户体验。
例如,若要创建 WMC 样式的背景页,可以执行下列操作:
<Application
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="HomePage.xaml">
<!--MediaCenterThemes.xaml-->
<Application.Resources>
<LinearGradientBrush x:Key="PageGlassyBackground" StartPoint="0,0.5" EndPoint="1,0.5">
<GradientStop Color="#ff2B6680" Offset="1.5" />
<GradientStop Color="#569dc2" Offset="0" />
</LinearGradientBrush>
...
</Application.Resources>
</Application>
由于主题通常包含多个元素,因此应考虑使用自定义资源字典封装 WMC 主题的样式:
<ResourceDictionary>
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" />
<LinearGradientBrush x:Key="PageGlassyBackground" StartPoint="0,0.5" EndPoint="1,0.5">
<GradientStop Color="#ff2B6680" Offset="1.5" />
<GradientStop Color="#569dc2" Offset="0" />
</LinearGradientBrush>
...
</ResourceDictionary>
若要将资源字典合并到一个应用程序中,将应用程序定义的 Application.Resources 元素配置为引用资源字典 .xaml 文件:
<Application
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="HomePage.xaml">
<!--MediaCenterThemes.xaml-->
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="MediaCenterTheme.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
下图显示了 如何使用 WMC 主题的完整样式和资源补充更新 WordGame!。
WMC 不限制您开发融合应用程序特定元素和品牌特定元素的应用程序主题。但是,为 WMC 用户体验设计任何应用程序时,应将应用程序主题的多个方面考虑在内,其中包括:
电视安全颜色:不要使用亮度很高、容易使人激动的颜色(例如绿色、红色)。
对比度:若要使文本在外观上不同于背景,请确保为视觉元素所选的前景色和背景色具有恰当的对比度级别。
字体:可以通过使用无衬线大号字体来提高可读性。此外,从内容中删除不必要的字词也有助于提高文本的可读性。
按钮:简化按钮的外观。
图像:创建图像时,请考虑显示质量和大小以及下载大小。
动画:在适当的时候使用动画。
有关 WMC 应用程序主题的详细信息,请参见 WMC SDK。
Layout
当用户将鼠标在 WMC 主机上悬停时,将发生一个不太明显的问题,可能会导致 WMC 主机显示鼠标驱动导航的其他导航 UI 元素,如下图所示:
从此图中,您可看到应用程序 UI 的左上部和右下部被导航镶边所覆盖。在这种情况下,您可以更新 UI 的布局,以将导航 UI 考虑在内。对于 WordGame!,这包括将应用程序标题移到 UI 的右部,以及向承载网页内容的 Grid 元素底部添加一个高度为 50 像素的行:
<Grid>
...
<Grid.RowDefinitions>
<RowDefinition Height="5" />
<RowDefinition Height="Auto" />
<RowDefinition Height="20" />
<RowDefinition Height="Auto" />
<RowDefinition />
<RowDefinition Height="50" />
</Grid.RowDefinitions>
<!-- Game title -->
<TextBlock ... TextAlignment="Right">Word Game!</TextBlock>
...
</Grid>
下图显示了添加这些行之后的效果:
因此,WMC 的 XBAP 需要了解 WMC 的各种布局行为以及一致性。
您应考虑的关键布局问题包括:
应用程序布局:应用程序布局应简单一致,以便于用户以与您的应用程序用户界面一致的风格进行开发和维护。
WMC 布局:您的应用程序布局应在实际上与常规 WMC 用户界面保持一致。这使得熟悉 WMC 的用户可以更快地熟悉您的应用产品。
视频:如果您的应用程序显示使用 WMC 托管 API 的视频,WMC 将在屏幕左下部播放视频。因此,您的用户界面布局应将此考虑在内。
分辨率:您的应用程序的用户界面和布局的分辨率应为 1024x768。WPF 提供对布局的支持,有助于您规划用户界面的布局,将分辨率设置为 1024x768,并可确保在调整用户界面时该布局保持不变(有关更多信息,请参见布局系统)。
有关 WMC 布局的详细信息,请参见 WMC SDK。
导航
实质上,主题和布局可确定包含您的应用程序用户界面的控件的排列方式。从另一方面来说,导航可确定您的用户访问这些控件和在这些控件之间移动的方式。
当前接收用户输入的控件被视为获得焦点。当显示 XBAP 应用程序中的某页时,若要将焦点放置在特定控件中,可以使用以下标记:
<!-- Set focus on guess character text box -->
<Page ... FocusManager.FocusedElement="{Binding ElementName=guessedChar}">
...
</Page>
您应当执行此操作以支持 2 英尺和 10 英尺操作模式。
若要使用户在 WMC 应用程序中以 2 英尺和 10 英尺模式导航您的控件,您的应用程序必须使用鼠标、键盘(连接的键盘或远程键盘)和遥控器处理导航。默认情况下,使用鼠标和键盘进行导航与针对任何 WPF 应用程序的操作相同,包括:
单击控件以使其切换为获得焦点状态。
在控件间按 Tab 键以移动焦点。
使用按钮的 IsDefault 属性指定按 Return 键时默认为单击该按钮。
使用按钮的 IsCancel 属性指定按 Esc 键时默认为单击该按钮。
若要支持遥控器,您需要支持方向导航,换言之,需要允许用户通过单击遥控器上的向上、向下、向左和向右按钮来移动控制焦点。只要您使用专门的 WPF 控件子集,您就不必专门编写任何特殊代码即可支持方向导航。
更新 WMC 上的 WPF 控件
尽管 WPF 提供了多种控件,然而默认情况下,这些控件中只有一部分适用于 WMC 应用程序。决定因素在于是否可以使用遥控器来导航和操作这些控件。下图显示了 WPF 控件中支持从遥控器输入的一部分控件(使用 WMC 样式):
这些限制不排除使用其他 WPF 控件,您需要执行其他操作,以便使它们能够运行在 WMC 中。例如,请考虑使用 Slider 控件,该控件显示为承载于 WMC 中,如下图所示:
默认情况下,可以使用鼠标、键盘或遥控器显示和导航到 Slider。但是,无法使用遥控器从 Slider 导航到其他控件 - Slider 将向上、向下、向左和向右遥控按键解释为试图增大或减小 Slider 的值。
在这些情况下,一种解决方案是创建一个包含所需控件以及遥控友好控件的复合控件来对其进行操作。例如,还可以使用两个按钮来控制 Slider,一个按钮用来减小 Slider 的值,另一个按钮用来增大 Slider 的值,代码如下:
<Page x:Class="SliderPage"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
<!-- Custom Slider -->
<StackPanel Margin="50" Orientation="Horizontal" VerticalAlignment="Top">
<Button
Name="decrementButton"
Click="decrementButton_Click"
Margin="10"
FontSize="10"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Width="40" Height="40">
-
</Button>
<Slider
Name="slider"
Focusable="False"
Width="100" Margin="0,15,0,0"
Minimum="0" Maximum="10" Value="50"
Interval="1" TickFrequency="1" TickPlacement="BottomRight" />
<Button
Name="incrementButton"
Click="incrementButton_Click"
Margin="10"
FontSize="10"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Width="40" Height="40">
+
</Button>
</StackPanel>
</Page>
using System.Windows;
using System.Windows.Controls;
public partial class SliderPage : System.Windows.Controls.Page
{
//</SnippetSliderPageCodeBehind1>
public SliderPage()
{
InitializeComponent();
}
void decrementButton_Click(object sender, RoutedEventArgs e)
{
this.slider.Value--;
}
void incrementButton_Click(object sender, RoutedEventArgs e)
{
this.slider.Value++;
}
}
下图演示了结果。
WMC 的其他 WPF 控件
另一个有问题的控件是 TextBox,如下图所示。使用遥控器,不可能真正将字符输入 TextBox。需要使用一个允许遥控器用户选择一个或多个字符的控件。对于那些由于外观因素而无法具有完整键盘的移动设备,目前常用的解决方法是在用户界面显示一个键盘,允许用户选择他们所需的字符。
该示例包括一个适用于面向 WMC 的 WPF 应用程序的软键盘控件,如下图所示:
该示例将作为随示例一起发布的 Keyboard.dll 程序集内的 SoftKeyboardTextBox 类来实现,并驻留在 MCEControls 命名空间内。若要使用它,您需要执行下列操作:
添加一个对 MCEControls 附带的 Keyboard 程序集的引用。
将一个 XML 命名空间声明添加到您的内容的程序集中。
添加 XAML,以声明并配置 SoftKeyboardTextBox。
下面的代码演示了结果:
<Page
...
xmlns:MCEControls="clr-namespace:MCEControls;assembly=Keyboard" >
...
<MCEControls:SoftKeyboardTextBox
Name="guessedChar"
Grid.Column="0"
Margin="0,0,5,0"
Width="80"
MaxLength="1" />
...
</Page>
使用 .NET Framework 3.0 类库
WMC 的 WPF 应用程序并非仅限于控件。WPF 应用程序也可以利用 .NET Framework 的丰富性获得更多功能,允许您对独立或浏览器承载的 WPF 应用程序使用相同的代码。
例如,在由 WMC 承载的应用程序和非 WMC 应用程序中,用于保存数据和从中加载数据的代码是相同的,这同样适用于安全约束(请参见 Windows Presentation Foundation 安全性);确定启动应用程序的位置取决于 WMC 承载的应用程序是否可以写入本地磁盘。
为安全起见,应用程序可使用独立存储来保留文件:
using System;
using System.ComponentModel;
using System.IO;
using System.IO.IsolatedStorage;
using System.Xml;
using System.Xml.Serialization;
...
public static PlayerScore Load()
{
try
{
// Load the playerscore.xml file from isolated storage
using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
using (Stream stream = new IsolatedStorageFileStream("playerscore.xml", FileMode.Open, isf))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(PlayerScore));
return (PlayerScore)xmlSerializer.Deserialize(stream);
}
}
catch (FileNotFoundException ex)
{
return new PlayerScore();
}
}
public static void Save(PlayerScore playerScore)
{
// Save the playerscore.xml file to isolated storage
using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
using (Stream stream = new IsolatedStorageFileStream("playerscore.xml", FileMode.Create, isf))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(PlayerScore));
xmlSerializer.Serialize(stream, playerScore);
}
}
与 WMC 托管 API 集成
WMC 的 WPF 应用程序也可通过一组托管 API 与 WMC 本身的功能集成在一起,这些 API 都是随操作系统安装的,位于以下两个程序集中:Microsoft.MediaCenter.dll 和 Microsoft.MediaCenter.UI.dll。
使用这些 API,您可以集成多种 WMC 服务,包括检查、配置和播放媒体内容。有关这些 API 的更多信息,请参见 WMC SDK。
这些功能的一个方面是将您的应用程序的用户体验与 WMC 深度集成。例如,如果 WPF 应用程序需要通过消息框通知用户,则可以通过以下方式显示信息:
但是,标准 WPF 消息框的外观与 WMC 的体验不一致。不过,幸运的是,WMC 托管 API 提供了其各自的 WMC 样式的消息框,您可以通过以下代码来使用它们:
using Microsoft.MediaCenter;
...
// Get media center host and show dialog box
MediaCenterEnvironment mce = Microsoft.MediaCenter.Hosting.AddInHost.Current.MediaCenterEnvironment;
mce.Dialog(msg, "WordGame!", DialogButtons.Ok, 1000, true);
这将显示类似于以下图片的 WMC 对话框:
若要深入了解 WMC 托管 API,请参考 WMC SDK。
![]() |
---|
您不能运行引用 WMC 托管 API 的 XBAP,除非 XBAP 是由 WMC 承载的。 |
使用 Visual Studio 开发
截至目前,本主题已讲述了为 WMC 生成 XBAP 时需要解决的多种核心编程问题,其中包括:
创建典型 XBAP 应用程序。
使用 .mcl 文件在 WMC 中启动 XBAP。
为 XBAP 创建 WMC 主题。
引用 WMC 托管 API。
这些都是您在为 WMC 生成每个 XBAP 时可能需要解决的问题。无需每次在为 WMC 生成 XBAP 时都亲自重新创建这些元素,您可以使用用于 Microsoft Visual Studio 2005 的 Media Center 应用程序 (WPF) 项目模板,该项目模板是随 WMC SDK 一起安装的。
![]() |
---|
WMC 项目模板仅在同时安装了 Visual Studio 2005 和 “Fidalgo” 时才可安装。 |
默认情况下,Media Center 应用程序 (WPF) 项目模板将创建一个包含这些元素的 Visual Studio 2005 项目。
若要新建 Media Center 应用程序 (WPF),请执行下列步骤:
打开 Visual Studio 2005。
选择**“Microsoft Visual Studio”|“文件”|“新建”|“项目”|“Visual C#”|“.NET Framework 3.0”|“Media Center 应用程序 (WPF)”**。
以下列表显示了由项目模板默认生成的关键项:
readme.txt 文件中包括一些有关为 WPF 生成和调试 XBAP 的有用文本。
对 WMC 托管程序集的引用。
MediaCenterTheme.xaml 文件是一个资源字典,包含一组完整的 WMC 样式,默认情况下,这些样式将应用到默认页 Page1.xaml。
随标准 XBAP 输出一起生成的 .mcl 文件。
请注意,有一个用于 Microsoft Visual Basic 的等效项目模板。
调试项目
若要在 WMC 主机内从 Visual Studio 2005 调试 XBAP,需要执行下列操作:
在**“解决方案资源管理器”中右击项目,并选择“属性”|“调试”**。
将**“启动程序”设置为“c:\windows\system32\presentationhost.exe”**。
将**“命令行参数”设置为“-debug”**。
通过选择**“Microsoft Visual Studio”|“调试”|“启动调试”**(或按 F5)运行应用程序。
双击在生成过程中生成的 .mcl 文件 (\bin\debug\assemblyname.mcl)。
将启动在 .mcl 文件中指定的应用程序,该应用程序由 WMC 承载。
为 WMC 安装 WPF 应用程序
使用 WMC 的一项优势在于能够帮助创建 Microsoft Windows Installer 应用程序(.msi 文件)。.通过 msi 文件,可以将您的 WPF 应用程序分发到 WMC 客户端计算机上。
将继续进行以下步骤,以便为 WordGame! 创建一个简单的 Windows Installer 应用程序:
在 Visual Studio 2005 中,右击**“解决方案资源管理器”中的 XBAP 解决方案,然后选择“添加”|“新建项目”**。
在**“项目类型”列表中,选择“其他项目类型”|“安装和部署”**。
在**“模板”列表中,选择“安装项目”或“安装向导”**(后者将指导您完成所创建的 Windows Installer 安装项目的初始配置)。
右击新的 Windows Installer 项目,并选择**“添加”|“文件”**,然后选择下列文件:
WordGameWMC.mcl
WordGameWMC.exe
WordGameWMC.exe.manifest
WordGameWMC.xbap
WordList.txt
Keyboard.dll
在**“文件系统”选项卡中,选择“用户桌面”**。
在文件列表中,右击并选择**“创建到用户桌面的快捷方式”[Create Shortcut to User's Desktop]**。
选择**“应用程序文件夹”|“WordGameWMC.mcl”**。
重新生成 Windows Installer 项目。
Windows Installer 项目生成时,将向生成输出文件夹生成一个 .msi 文件。该文件随后将复制到客户端计算机上,并运行以安装应用程序。默认安装将创建符合以下格式的文件夹:
c:\program files\CompanyName\ApplicationName\Application Files
配置 Windows Installer 项目的过程中选择的所有文件将复制到此文件夹中,同时复制的还有由 Windows Installer 项目选择的所有依赖程序集。
此外,桌面上将生成指向 WordGameWMC.mcl 的快捷方式图标,您可双击或浏览该图标,以启动 WMC 内部的应用程序。
![]() |
---|
应用程序自身的项目文件需要手动更新,以确保指向添加到生成的 .mcl 文件中的 .xbap 文件的路径正确无误,以便进行安装。 |
此安装是一个演示,您可通过该演示了解为 WMC 的 WPF 应用程序创建 Windows Installer 的基础知识。
对于 WMC 中实际的 WPF 应用程序,您的安装方法应该有所不同。
首先,您的应用程序应安装一个 HTML 文件,该文件可提供指向实际 Web 服务器承载的 WPF 应用程序的链接。通过在 Web 服务器上承载,客户端计算机可以创建、发布和选取该应用程序的新版本,而无需用户重新安装应用程序。
其次,您不应使用 .mcl 文件。而是应创建一个调用 WMCMediaCenter.RegisterApplicationAPI 的 Windows Installer,或者应运行 RegisterMceApp.exe 命令行实用工具。有关更多详细信息,请参见 WMC SDK。
请参见
概念
Windows Presentation Foundation XAML 浏览器应用程序概述
其他资源
Windows Media Center Software Development Kit(Windows Media Center 软件开发工具包)