2010-06-09 3 views
1

NativeActivityActivity 본문이 있습니다. 이 액티비티의 목적은 하위 액티비티 기간 동안 리소스를 Variable으로 노출하는 것입니다. 내가 만난 문제는 Variable이 활동 외부에서 사용될 수 없다는 것입니다. 예제 자원으로 StreamReader을 사용하겠습니다.NativeActivity 변수를 워크 플로우 디자이너에게 공개하십시오.

ResourceActivity.cs는 :

[Designer(typeof(ResourceActivityDesigner))] 
public sealed class ResourceActivity : NativeActivity 
{ 
    [RequiredArgument] 
    public InArgument<string> Path { get; set; } 

    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
    public Activity Body { get; set; } 

    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
    public Variable<StreamReader> Resource { get; set; } 

    public ResourceActivity() 
    { 
     this.Resource = new Variable<StreamReader> 
     { 
      Default = null, 
      Name = "reader" 
     }; 
    } 

    protected override void CacheMetadata(NativeActivityMetadata metadata) 
    { 
     if (this.Path != null) metadata.AddArgument(this.Path); 
     if (this.Body != null) metadata.AddChild(this.Body); 
     if (this.Resource != null) metadata.AddVariable(this.Resource); 
    } 

    protected override void Execute(NativeActivityContext context) 
    { 
     this.Resource.Set(context, new StreamReader(this.Path.Get(context))); 
     context.ScheduleActivity(this.Body, new completionCallback(Done), new FaultCallback(Faulted)); 
    } 

    private void Done(NativeActivityContext context, ActivityInstance instance) 
    { 
     var reader = this.Reader.Get(context); 
     if (reader != null) reader.Dispose(); 
    } 

    private void Faulted(NativeActivityFaultContext context, Exception ex, ActivityInstance instance) 
    { 
     var reader = this.Reader.Get(context); 
     if (reader != null) reader.Dispose(); 
    } 
} 

나는 워크 플로 디자이너에서 변수 목록에서 "자원"또는 "독자"를 볼 수 없습니다. CacheMetadata에 뭔가 빠졌습니까?

답변

0

답변은 Collection<Variable>을 클래스에 추가 한 것처럼 보입니다. CacheMetadata은 필요하지 않았습니다.

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
public Collection<Variable> Variables { get; private set; } 

public ResourceActivity() 
{ 
    this.Resource = new Variable<StreamReader> { Default = null, Name = "reader" }; 
    this.Variables = new Collection<Variable>(new [] { this.Resource }); 
} 

편집 : 아니가, 지금은 오류가 변수가 여러 번 정의 된 어떤 상태 발생합니다. 난 그냥 표시되지 않습니다 변수 컬렉션에 자원 ...

편집 # 2 추가 떠날 경우 나는 마이크로 소프트 연결에 버그로 제출을하고 이것이다 알려진 버그, but it is not targetted for a fix in VS 2010. It has been postponed.을 들었다

+0

첫 번째 오류는 변수가 xaml로 직렬화되므로 직렬화가 해제되면 생성자가 먼저 변수를 추가 한 다음 비 직렬화 된 집합이 컬렉션에 추가되어 해당 오류가 발생하기 때문입니다. 해당 코드를 IActivityTemplateFactory.Create로 이동하면 해당 오류가 발생하지 않습니다. 귀하가보고 한 버그는 Activity가 자녀들을위한 변수를 생성하고 노출 할 수있을뿐만 아니라 그것들에 액세스 할 수없는 다른 것으로 보입니다. 어떤 종류의 범위 BS. 같은 문제가 있습니다. 해결 방법을 찾은 적이 있습니까? – Will

+1

btw, 사실 변수를 업데이트하는 것이 목적 인 더미 자식 활동을 작성하려고합니다. Effing. 어리석은. – Will

+0

@ 윌 : 우리는 WF에 대한 막대한 좌절감과 사소한 것 이상으로 일관된 문서가 없기 때문에 그 신청서를 재구성했습니다. WF에 대한 MS의 지원은 너무나도 혐오 스럽습니다. 따라서 우리는 충분한 해결 방법이 없어서 앱의 일부를 기본적으로 제거했습니다. serialization/deserialization에 대한 답변을 대답으로 추가하면 받아 들일 수있는 것으로 표시됩니다. – user7116

0

액티비티 자체와 액티비티간에 변수를 공유하려면 액티비티 대신 액티비티 액티비티로 바디를 정의해야합니다. Matt Winkler의 블로그 게시물 this을 참조하십시오.