Limitações de serialização de XamlWriter.Save
A API Save pode ser usada para serializar o conteúdo de uma aplicação Windows Presentation Foundation (WPF) como um ficheiro XAML (Extensible Application Markup Language). No entanto, existem algumas limitações notáveis relativamente ao que é serializado. Essas limitações e algumas considerações gerais estão documentadas neste tópico.
Tempo de execução, não a representação Design-Time
A filosofia subjacente do que é serializado através de uma chamada para Save é que o resultado será uma representação do objeto que está a ser serializado, em tempo de execução. Muitas propriedades em tempo de projeto do arquivo XAML original podem já estar otimizadas ou perdidas no momento em que o XAML é carregado como objetos em memória, e não são preservadas quando o método Save é chamado para serializar. O resultado serializado é uma representação efetiva da árvore lógica construída do aplicativo, mas não necessariamente do XAML original que o produziu. Esses problemas tornam extremamente difícil usar a serialização Save como parte de uma extensa superfície de design XAML.
A serialização é Self-Contained
A saída serializada de Save é independente; tudo o que é serializado está contido em uma única página XAML, com um único elemento raiz e nenhuma referência externa além de URIs. Por exemplo, se sua página fez referência a recursos de recursos do aplicativo, eles aparecerão como se fossem um componente da página que está sendo serializada.
As referências de extensão são desreferenciadas
Referências comuns a objetos feitas por vários formatos de extensões de marcação, como StaticResource
ou Binding
serão desreferenciadas pelo processo de serialização. Eles já foram desreferenciados no momento em que os objetos na memória foram criados pelo tempo de execução do aplicativo, e a lógica Save não revisita o XAML original para restaurar essas referências para a saída serializada. Isso pode congelar qualquer valor ligado a dados ou obtido de recurso, tornando-o o último valor usado pela representação em tempo de execução, com apenas uma capacidade limitada ou indireta de distinguir tal valor de qualquer outro definido localmente. As imagens também são serializadas como referências de objeto para imagens tal como existem no projeto, em vez de como referências de origem originais, perdendo qualquer nome de arquivo ou URI originalmente referenciado. Mesmo os recursos declarados dentro da mesma página são vistos serializados no ponto em que foram referenciados, em vez de serem preservados como uma chave de uma coleção de recursos.
A manipulação de eventos não é preservada
Quando os manipuladores de eventos que são adicionados por meio de XAML são serializados, eles não são preservados. O XAML sem code-behind (e também sem o mecanismo x:Code relacionado) não tem como serializar a lógica processual do tempo de execução. Como a serialização é independente e limitada à árvore lógica, não há nenhum recurso para armazenar os manipuladores de eventos. Como resultado, os atributos do manipulador de eventos, tanto o próprio atributo quanto o valor da cadeia de caracteres que nomeia o manipulador, são removidos do XAML de saída.
Cenários realistas para uso de XAMLWriter.Save
Embora as limitações listadas aqui sejam bastante substanciais, ainda há vários cenários apropriados para usar Save para serialização.
Saída vetorial ou gráfica: A saída da área renderizada pode ser usada para reproduzir o mesmo vetor ou os mesmos gráficos quando recarregados.
Rich text e documentos de fluxo: O texto e toda a formatação e contenção de elementos dentro dele são preservados na saída. Isso pode ser útil para mecanismos que se aproximam de funcionalidade de área de transferência.
Preservando dados de objetos de negócios: se você tiver armazenado dados em elementos personalizados, como dados XML, desde que seus objetos de negócios sigam regras básicas de XAML, como fornecer construtores personalizados e conversão para valores de propriedade por referência, esses objetos de negócios podem ser perpetuados por meio da serialização.
.NET Desktop feedback