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

Ok。6 時間の試行とテストの後、ようやくアクティビティを実行できるようになりました。最終的なコードは次のとおりです。

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 internal activity, in codeは私を大いに助けてくれました。ワークフロー フレームワークは日常的な C# コードではないようです。私はまだ学ぶことがたくさんあります。これが他の誰かに役立つことを願っています。

于 2012-08-14T09:19:24.673 に答える