2014-12-27 23 views
6

我目前已将Cortana实施到我的Silverlight应用程序中。语音命令存储在CortanaCommands.xml,这里是代码:如何修改C#中的Cortana Voice Activation命令(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>" 

在这个例子中,如果用户柯塔娜部署和说,然后应用程序导航“贝利博士,是它会下雨吗?”到CortanaText.xaml。这是硬编码到XML中,我希望用户能够自定义他们的命令前缀和他们的命令。

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

回答

0

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

首先,我们加载XML文件到独立存储和使用

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

,而不是

ms-appx:///CortanaCommands.xml加载从独立存储的VCD文件。

"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完全重写为用户喜欢的。

我应该提一下,对于我们的目的,我们不需要短语主题,因为我们只使用一个导航命令。我们删除了那个短语话题,因为它是可选的,并且在听到“要下雨了”时将[创建] {听写}改为