6

我目前已将 Cortana 实施到我的 Silverlight 应用程序中。语音命令存储在 CortanaCommands.xml 中,代码如下:

<?xml version="1.0" encoding="utf-8"?>

<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.1">
<CommandSet xml:lang="en-US">
<CommandPrefix>Dr. Bailey</CommandPrefix>
<Example> Open app to take dictation </Example>

<Command Name="Text">
  <Example> Is it going to rain? </Example>
  <ListenFor> [create] {dictation} </ListenFor>
  <Feedback> "" </Feedback>
  <Navigate Target="/Views/CortanaText.xaml" />
</Command>

<PhraseTopic Label="dictation" Scenario="Dictation">
  <Subject> Cal 123 </Subject>
</PhraseTopic>
</CommandSet>
</VoiceCommands>"

在此示例中,如果用户部署 Cortana 并说“Bailey 博士,会下雨吗?”,然后应用导航到 CortanaText.xaml。这是硬编码到 XML 中的,我希望用户能够自定义他们的命令前缀和命令。

通过使用 2 个文本框,我在 C# 中编写了一个包含整个 XML 的字符串,但插入了包含新命令前缀和命令的文本框中的选项。此字符串称为 cortanaXMLstring。用新字符串覆盖 CortanaCommands.xml 中现有代码的最佳方法是什么?我认为这比修改现有 XML 的 2 个不同区域更容易。我还认为可以删除 CortanaCommands.xml(使用 c# 代码),然后通过简单地插入字符串重新创建 XML,因为字符串包含 XML 所需的所有文本?或者,关于如何修改 XML 中的这两个字段,还有其他建议吗?它是命令前缀和命令示例。感谢您提供的任何帮助!

4

1 回答 1

0

所以我们在一段时间后解决了这个问题。

首先,我们将 XML 文件加载到独立存储中,并使用以下方法从独立存储中加载 VCD 文件

await VoiceCommandService.InstallCommandSetsFromFileAsync(new Uri("ms-appdata:///local/CortanaCommands.xml", UriKind.RelativeOrAbsolute));

代替

ms-appx:///CortanaCommands.xml.

"ms-appdata:///local/CortanaCommands.xml"

是从独立存储文件夹而不是从 XAP 文件加载的内容。

然后我们用代码完全重写了xml文件,替换了

<CommandPrefix><ListenFor>

来自两个文本框的用户输入。我们将其加载到流中并使用

document.Root.RemoveAll();

从 CortanaCommands.xml 中删除旧的 xml 信息,并使用我们的新数据将流重写为 xml 并重新加载

VoiceCommandService.InstallCommandSetsFromFileAsync(new Uri("ms-appdata:///local/CortanaCommands.xml", UriKind.RelativeOrAbsolute));

这样做允许用户添加自定义命令前缀和短语来启动我们想要启动的页面。这可用于更改 xml 文件中的任何内容,并将 VCD 完全重写为用户喜欢的内容。

我应该提到,出于我们的目的,我们不需要短语 topic,因为我们只使用一个导航命令。我们删除了该短语主题,因为它无论如何都是可选的,并将监听器中的 [create] {dictation} 更改为“会下雨吗”

于 2015-01-12T05:52:17.533 回答