共用方式為


刪除設計師新增至 XAML 檔案中的檢視狀態

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);

若要使用此範例

  1. 使用 Visual Studio 開啟ViewStateCleaningWriter.sln方案檔。

  2. 開啟命令提示字元,並流覽至建置 ViewStageCleaningWriter.exe 的目錄。

  3. 在 Workflow1.xaml 檔案上執行 ViewStateCleaningWriter.exe。

    可執行文件的語法會顯示在下列範例中。

    ViewStateCleaningWriter.exe [input file] [output file]
    

    這會將 XAML 檔案輸出至 [outfile],此檔案已移除其所有檢視狀態資訊。

備註

對於Sequence工作流程,會移除一些與虛擬化相關的提示信息。 這會導致設計者下次載入時重新計算版面配置。 當您使用此範例作為Flowchart時,會移除所有佈局和線路配置資訊,並在後續載入於設計工具時,所有活動物件都會堆疊在螢幕左側。

若要建立範例 XAML 檔案以搭配此範例使用

  1. 開啟 Visual Studio。

  2. 建立新的工作流程主控台應用程式。

  3. 將一些活動拖放到畫布上

  4. 儲存工作流程 XAML 檔案。

  5. 檢查 XAML 檔案以查看檢視狀態附加屬性。