ViewStateCleaningWriter 範例示範如何建立衍生自 XamlWriter 的類別,並從 XAML 檔案移除檢視狀態。 Windows 工作流程設計工具會將資訊寫入 XAML 檔,也就是所謂的檢視狀態。 檢視狀態指的是設計時所需的資訊,例如佈局定位,但在執行時不需要。 工作流程設計工具會在編輯時,將此資訊插入 XAML 檔中。 工作流程設計工具會使用 mc:Ignorable 屬性將檢視狀態寫入 XAML 檔案,因此當運行時間載入 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]這會將 XAML 檔案輸出至 [outfile],此檔案已移除其所有檢視狀態資訊。
備註
對於Sequence工作流程,會移除一些與虛擬化相關的提示信息。 這會導致設計者下次載入時重新計算版面配置。 當您使用此範例作為Flowchart時,會移除所有佈局和線路配置資訊,並在後續載入於設計工具時,所有活動物件都會堆疊在螢幕左側。
若要建立範例 XAML 檔案以搭配此範例使用
開啟 Visual Studio。
建立新的工作流程主控台應用程式。
將一些活動拖放到畫布上
儲存工作流程 XAML 檔案。
檢查 XAML 檔案以查看檢視狀態附加屬性。