Removendo o estado de exibição que o designer adiciona a um arquivo XAML
O exemplo ViewStateCleaningWriter demonstra como criar uma classe que deriva e remove o estado de XamlWriter exibição de um arquivo XAML. O Designer de Fluxo de Trabalho do Windows grava informações no documento XAML, que é conhecido como estado de exibição. O estado de exibição refere-se às informações necessárias em tempo de design, como posicionamento de layout, que não são necessárias em tempo de execução. O Designer de Fluxo de Trabalho insere essas informações no documento XAML à medida que ele é editado. O Designer de Fluxo de Trabalho grava o estado de exibição no arquivo XAML com o atributo, portanto mc:Ignorable
, essas informações não são carregadas quando o tempo de execução carrega o arquivo XAML. Este exemplo demonstra como criar uma classe que remove essas informações de estado de exibição durante o processamento de nós XAML.
Debate
Este exemplo demonstra como criar um gravador personalizado.
Para criar um gravador XAML personalizado, crie uma classe que herda do XamlWriter. Como os gravadores XAML geralmente são aninhados, é comum acompanhar um gravador XAML "interno". Esses gravadores "internos" podem ser pensados como a referência à pilha restante de gravadores XAML, permitindo que você tenha vários pontos de entrada para fazer trabalho e, em seguida, delegue o processamento ao restante da pilha.
Neste exemplo, há alguns itens de interesse. Uma é a verificação para ver se o item que está sendo escrito é de um namespace de designer. Observe que isso também elimina o uso de outros tipos do namespace do designer em um fluxo de trabalho.
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; }
Isso também cria uma pilha de membros XAML que são usados ao percorrer o fluxo do nó. O trabalho restante desta amostra está em grande parte contido no WriteStartMember
método.
public override void WriteStartMember(XamlMember xamlMember)
{
MemberStack.Push(xamlMember);
if (IsDesignerAttachedProperty(xamlMember))
{
m_attachedPropertyDepth++;
}
if (m_attachedPropertyDepth > 0)
{
return;
}
InnerWriter.WriteStartMember(xamlMember);
}
Os métodos subsequentes verificam se ainda estão contidos em um contêiner de estado de exibição e, em caso afirmativo, retornam e não passam o nó para baixo na pilha do gravador.
public override void WriteValue(Object value)
{
if (m_attachedPropertyDepth > 0)
{
return;
}
InnerWriter.WriteValue(value);
}
Para usar um gravador XAML personalizado, você deve encadeá-lo em uma pilha de gravadores XAML. O código a seguir mostra como isso pode ser usado.
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);
Para usar este exemplo
Usando o Visual Studio, abra o arquivo de solução ViewStateCleaningWriter.sln.
Abra um prompt de comando e navegue até o diretório onde o ViewStageCleaningWriter.exe é construído.
Execute ViewStateCleaningWriter.exe no arquivo Workflow1.xaml.
A sintaxe do executável é mostrada no exemplo a seguir.
ViewStateCleaningWriter.exe [input file] [output file]
Isso gera um arquivo XAML para [outfile], que tem todas as suas informações de estado de exibição removidas.
Nota
Para um Sequence fluxo de trabalho, várias dicas de virtualização são removidas. Isso faz com que o designer recalcule o layout na próxima vez que ele for carregado. Quando você usa este exemplo para um Flowchart, todas as informações de posicionamento e roteamento de linha são removidas e, ao carregar subsequentemente no designer, todas as atividades são empilhadas no lado esquerdo da tela.
Para criar um arquivo XAML de exemplo para uso com este exemplo
Abra o Visual Studio.
Crie um novo Aplicativo de Console de Fluxo de Trabalho.
Arraste e solte algumas atividades na tela
Salve o arquivo XAML do fluxo de trabalho.
Inspecione o arquivo XAML para ver as propriedades anexadas ao estado de exibição.