次の方法で共有


デザイナーが XAML ファイルに追加するビューステートの削除

ViewStateCleaningWriter サンプルでは、XamlWriterから派生し、XAML ファイルからビューステートを削除するクラスを作成する方法を示します。 Windows ワークフロー デザイナーは、ビューステートと呼ばれる XAML ドキュメントに情報を書き込みます。 ビューステートとは、実行時に必要ないレイアウト配置など、デザイン時に必要な情報を指します。 ワークフロー デザイナーは、編集時にこの情報を XAML ドキュメントに挿入します。 ワークフロー デザイナーは、 mc:Ignorable 属性を使用してビュー ステートを XAML ファイルに書き込むため、ランタイムが XAML ファイルを読み込むときにこの情報は読み込まれません。 このサンプルでは、XAML ノードの処理中にそのビュー ステート情報を削除するクラスを作成する方法を示します。

議論

このサンプルでは、カスタム ライターを作成する方法を示します。

カスタム XAML ライターを構築するには、 XamlWriterから継承するクラスを作成します。 XAML ライターは入れ子になることが多いため、"内部" XAML ライターを追跡するのが一般的です。 これらの "内部" ライターは、XAML ライターの残りのスタックへの参照と考えることができます。これにより、複数のエントリ ポイントを使用して作業を行い、処理をスタックの残りの部分に委任することができます。

このサンプルには、関心のある項目がいくつかあります。 1 つは、書き込まれる項目がデザイナー名前空間からのものかどうかを確認するチェックです。 これにより、ワークフロー内のデザイナー名前空間から他の型の使用も取り除かれます。

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 ファイルを調べて、ビューステート添付プロパティを確認します。