デザイナーによって XAML ファイルに追加されるビューステートの削除
このトピックの内容は、Windows Workflow Foundation 4 に該当します。
このサンプルでは、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 = "https://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 2010 を使用して、ViewStateCleaningWriter.sln ソリューション ファイルを開きます。
コマンド プロンプトを開き、ViewStageCleaningWriter.exe がビルドされているディレクトリに移動します。
Workflow1.xaml ファイルに対して ViewStateCleaningWriter.exe を実行します。
実行可能ファイルの構文の例を次に示します。
ViewStateCleaningWriter.exe [入力ファイル] [出力ファイル]
これにより、XAML ファイルは、すべてのビューステート情報が削除された状態で [出力ファイル] に出力されます。
注 : Sequence ワークフローでは、多数の仮想化のヒントが削除されます。その結果、デザイナーは次回の読み込み時にレイアウトを再計算します。このサンプルを Flowchart に対して使用すると、すべての配置情報および線のルーティング情報が削除され、後続のデザイナーへの読み込み時にすべてのアクティビティが画面の左側に積み上げられます。
このサンプルで使用するサンプル XAML ファイルを作成するには
Visual Studio 2010 を開きます。
新しいワークフロー コンソール アプリケーションを作成します。
いくつかのアクティビティをキャンバスにドラッグ アンド ドロップします。
ワークフロー XAML ファイルを保存します。
XAML ファイルを調べて、ビューステートの添付プロパティを確認します。
注 : |
---|
サンプルは、既にコンピューターにインストールされている場合があります。続行する前に、次の (既定の) ディレクトリを確認してください。
<InstallDrive>:\WF_WCF_Samples
このディレクトリが存在しない場合は、「.NET Framework 4 向けの Windows Communication Foundation (WCF) および Windows Workflow Foundation (WF) のサンプル」にアクセスして、Windows Communication Foundation (WCF) および WF のサンプルをすべてダウンロードしてください。このサンプルは、次のディレクトリに格納されます。
<InstallDrive>:\WF_WCF_Samples\WF\Basic\Designer\ViewStateCleaningWriter
|