我陷入困境,我想要编写一个封装另一个现有活动的活动。
预先存在的Activity是调用SaySpeech并且它有一些参数。所需的是连接和文本(它将使用TTS对连接说话)。它是一个AsyncCodeActivity。
我正在创建一个名为SayPassword的新活动,它接受与SaySpeech相同的参数,但不是TextToSpeak,而是具有PasswordToSpeak。这方面的前奏是:Generate a sentence from a pre defined words
现在,在内部调用SaySpeech之前,我需要为它提供与收到的SayPassword相同的参数,并用生成的PasswordToSpeak替换TextToSpeak参数值。
一切都完成了,除了我无法弄清楚我是如何在内部启动SaySpeech活动的?我需要使用SayPassword的EndExecute在SayPassword和EndExecute中调用SaySpeech的BeginExecute。
任何指针?
答案 0 :(得分:3)
CodeActivity不允许您执行子活动,您需要使用NativeActivity。在Execute()方法中,您可以使用context.ScheduleActivity()要求运行时为您执行另一个活动。
public sealed class MyActivity : NativeActivity
{
public Activity Body { get; set; }
protected override void Execute(NativeActivityContext context)
{
context.ScheduleActivity(Body);
}
}
答案 1 :(得分:1)
确定。经过六个小时的试验和测试,我终于开始了我的活动。这是最终的代码:
public sealed class SayPassword : NativeActivity
{
[RequiredArgument]
public InArgument<ConnectionInfo> Connection { get; set; }
[RequiredArgument]
public InArgument<String> Password { get; set; }
public InArgument<String> Language { get; set; }
public InArgument<Int32?> Speaker { get; set; }
#region Implementation
private SaySpeech InnerSaySpeech { get; set; }
private Variable<ConnectionInfo> TempConnectionInfo { get; set; }
private Variable<String> TempUtterance { get; set; }
private Variable<String[]> TempParameters { get; set; }
private Variable<String> TempLanguage { get; set; }
private Variable<Int32?> TempSpeaker { get; set; }
#endregion
public SayPassword()
{
TempConnectionInfo = new Variable<ConnectionInfo>();
TempUtterance = new Variable<String>();
TempParameters = new Variable<String[]>();
TempLanguage = new Variable<String>();
TempSpeaker = new Variable<Int32?>();
InnerSaySpeech = new SaySpeech
{
Connection = new InArgument<ConnectionInfo>(TempConnectionInfo),
Utterance = new InArgument<string>(TempUtterance),
Parameters = new InArgument<string[]>(TempParameters),
Language = new InArgument<string>(TempLanguage),
Speaker = new InArgument<int?>(TempSpeaker)
};
}
private String[] GetSentences(String password) {}
private static string GetPlaceholderString(Int32 NumberOfPlaceholders) {}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
metadata.AddImplementationVariable(TempConnectionInfo);
metadata.AddImplementationVariable(TempUtterance);
metadata.AddImplementationVariable(TempParameters);
metadata.AddImplementationVariable(TempLanguage);
metadata.AddImplementationVariable(TempSpeaker);
metadata.AddImplementationChild(InnerSaySpeech);
}
protected override void Execute(NativeActivityContext context)
{
String[] SpeakablePassword = GetSentences(Password.Get(context));
context.SetValue(TempConnectionInfo, Connection.Get(context));
context.SetValue(TempUtterance, GetPlaceholderString(SpeakablePassword.Length));
context.SetValue(TempParameters, SpeakablePassword);
context.SetValue(TempLanguage, Language.Get(context));
context.SetValue(TempSpeaker, Speaker.Get(context));
context.ScheduleActivity(InnerSaySpeech);
}
}
我需要创建中间变量来映射传入的参数,以便它们可以成功传递给内部活动。
文章Misadventures in CacheMetadata – wrapping an inner activity, in code给了我很多帮助。似乎工作流框架不是您的日常c#代码。我还有很多需要学习的东西。希望这对别人来说很方便。