1

我被困在一个地方,我想编写一个封装另一个预先存在的活动的活动。

预先存在的 Activity 是调用 SaySpeech,它有一些参数。所需的是一个连接和一个文本(它将使用 TTS 连接到连接上)。它是一个 AsyncCodeActivity。

我正在创建一个名为 SayPassword 的新活动,它接受与 SaySpeech 相同的参数,但不是 TextToSpeak,而是 PasswordToSpeak。其前奏是:从预先定义的单词生成一个句子

现在,在内部调用 SaySpeech 之前,我需要为其提供与收到的 SayPassword 相同的参数,并将 TextToSpeak 参数值替换为生成的 PasswordToSpeak。

除了我无法弄清楚如何在内部代码中启动 SaySpeech 活动之外,一切都已完成?我需要在 SayPassword 中调用 SaySpeech 的 BeginExecute,并使用 SayPassword 的 EndExecute 调用 EndExecute。

任何指针?

4

2 回答 2

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);
    }
}
于 2012-08-14T07:31:25.460 回答
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);
    }
}

我需要创建中间变量来映射传入的参数,以便它们可以成功地传递给内部活动。

CacheMetadata中的 Misadventures 文章– 用代码包装内部活动对我帮助很大。工作流框架似乎不是您日常的 c# 代码。我还有很多东西要学。希望这对其他人有用。

于 2012-08-14T09:19:24.673 回答