ViewStateCleaningWriter 샘플에서는 XAML 파일에서 XamlWriter 뷰 상태를 파생하고 제거하는 클래스를 만드는 방법을 보여 줍니다. Windows 워크플로 디자이너는 뷰 상태라고 하는 XAML 문서에 정보를 씁니다. 뷰 상태는 런타임에 필요하지 않은 레이아웃 위치 지정과 같이 디자인 타임에 필요한 정보를 나타냅니다. 워크플로 디자이너는 이 정보를 편집할 때 XAML 문서에 삽입합니다. 워크플로 디자이너는 특성이 있는 XAML 파일에 mc:Ignorable
뷰 상태를 기록하므로 런타임에서 XAML 파일을 로드할 때 이 정보가 로드되지 않습니다. 이 샘플에서는 XAML 노드를 처리하는 동안 해당 뷰 상태 정보를 제거하는 클래스를 만드는 방법을 보여 줍니다.
토론
이 샘플에서는 사용자 지정 작성기를 만드는 방법을 보여 줍니다.
사용자 지정 XAML 작성기를 빌드하려면 XamlWriter을(를) 상속하는 클래스를 만드세요. XAML 작성기는 종종 중첩되므로 일반적으로 "내부" XAML 작성기를 추적하는 것이 일반적입니다. 이러한 "내부" 작성자는 XAML 작성기의 나머지 스택에 대한 참조로 간주될 수 있어 여러 진입점에서 작업을 수행하고 스택의 나머지 부분에 처리를 위임할 수 있습니다.
이 샘플에는 관심 있는 몇 가지 항목이 있습니다. 하나는 작성 중인 항목이 디자이너 네임스페이스에서 온 것인지 확인하는 것입니다. 또한 워크플로의 디자이너 네임스페이스에서 다른 형식의 사용도 제거합니다.
static Boolean IsDesignerAttachedProperty(XamlMember xamlMember)
{
return xamlMember.IsAttachable &&
xamlMember.PreferredXamlNamespace.Equals(c_sapNamespaceURI, StringComparison.OrdinalIgnoreCase);
}
const String c_sapNamespaceURI = "http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation";
// The next item of interest is the constructor, where the utilization of the inner XAML writer is seen.
public ViewStateCleaningWriter(XamlWriter innerWriter)
{
this.InnerWriter = innerWriter;
this.MemberStack = new Stack<XamlMember>();
}
XamlWriter InnerWriter {get; set; }
Stack<XamlMember> MemberStack {get; set; }
또한 노드 스트림을 트래버스하는 동안 사용되는 XAML 멤버 스택을 만듭니다. 이 샘플의 나머지 작업은 대부분 WriteStartMember
메서드에 포함되어 있는 메서드입니다.
public override void WriteStartMember(XamlMember xamlMember)
{
MemberStack.Push(xamlMember);
if (IsDesignerAttachedProperty(xamlMember))
{
m_attachedPropertyDepth++;
}
if (m_attachedPropertyDepth > 0)
{
return;
}
InnerWriter.WriteStartMember(xamlMember);
}
그런 다음, 후속 메서드가 뷰 상태 컨테이너에 여전히 포함되어 있는지 확인하고, 그렇다면 노드를 반환하고 기록기 스택 아래로 전달하지 않습니다.
public override void WriteValue(Object value)
{
if (m_attachedPropertyDepth > 0)
{
return;
}
InnerWriter.WriteValue(value);
}
사용자 지정 XAML 작성기를 사용하려면 XAML 작성기 스택에 함께 연결해야 합니다. 다음 코드는 이를 사용하는 방법을 보여줍니다.
XmlWriterSettings writerSettings = new XmlWriterSettings { Indent = true };
XmlWriter xmlWriter = XmlWriter.Create(File.OpenWrite(args[1]), writerSettings);
XamlXmlWriter xamlWriter = new XamlXmlWriter(xmlWriter, new XamlSchemaContext());
XamlServices.Save(new ViewStateCleaningWriter(ActivityXamlServices.CreateBuilderWriter(xamlWriter)), ab);
이 샘플을 사용하려면
Visual Studio를 사용하여 ViewStateCleaningWriter.sln 솔루션 파일을 엽니다.
명령 프롬프트를 열고 ViewStageCleaningWriter.exe 빌드된 디렉터리로 이동합니다.
Workflow1.xaml 파일에서 ViewStateCleaningWriter.exe 실행합니다.
실행 파일에 대한 구문은 다음 예제에 나와 있습니다.
ViewStateCleaningWriter.exe [input file] [output file]
그러면 모든 뷰 상태 정보가 제거된 [outfile]에 XAML 파일이 출력됩니다.
비고
워크플로의 Sequence 경우 여러 가상화 힌트가 제거됩니다. 이렇게 하면 디자이너가 다음에 로드될 때 레이아웃을 다시 계산합니다. 이 샘플을 Flowchart에 사용할 때, 모든 위치 지정 및 경로 정보가 제거되며, 이후 디자이너에 로드될 때, 화면의 왼쪽에 모든 활동이 쌓이게 됩니다.
이 샘플에 사용할 샘플 XAML 파일을 만들려면
Visual Studio를 엽니다.
새 워크플로 콘솔 애플리케이션을 만듭니다.
캔버스에 몇 가지 활동을 드래그 앤 드롭하세요.
워크플로 XAML 파일을 저장합니다.
XAML 파일을 검사하여 뷰 상태 연결 속성을 확인합니다.
.NET