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);
このサンプルを使用するには
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 ファイルを調べて、ビューステート添付プロパティを確認します。
.NET