Limitazioni di serializzazione di XamlWriter.Save
L'API Save può essere usata per serializzare il contenuto di un'applicazione Windows Presentation Foundation (WPF) come file XAML (Extensible Application Markup Language). Tuttavia, esistono alcune limitazioni rilevanti in esattamente ciò che viene serializzato. Queste limitazioni e alcune considerazioni generali sono documentate in questo argomento.
Rappresentazione in fase di esecuzione, non Design-Time
La filosofia di base di ciò che viene serializzato da una chiamata a Save è che il risultato sarà una rappresentazione dell'oggetto serializzato, in fase di esecuzione. Molte proprietà in fase di progettazione del file XAML originale potrebbero essere già ottimizzate o perse dal momento in cui il codice XAML viene caricato come oggetti in memoria e non vengono mantenute quando si chiama Save per serializzare. Il risultato serializzato è una rappresentazione efficace dell'albero logico costruito dell'applicazione, ma non necessariamente del codice XAML originale che lo ha prodotto. Questi problemi rendono estremamente difficile usare la serializzazione Save come parte di un'ampia area di progettazione XAML.
La serializzazione è Self-Contained
L'output serializzato di Save è autonomo; tutto ciò che viene serializzato è contenuto all'interno di una singola pagina XAML, con un singolo elemento radice e nessun riferimento esterno diverso da URI. Ad esempio, se la pagina ha fatto riferimento alle risorse dell'applicazione, queste verranno visualizzate come se fossero un componente della pagina serializzata.
I riferimenti all'estensione sono dereferenziati
I riferimenti comuni agli oggetti creati da vari formati di estensione di markup, ad esempio StaticResource
o Binding
, verranno dereferenziati dal processo di serializzazione. Questi oggetti sono già stati dereferenziati al momento della creazione di oggetti in memoria dal runtime dell'applicazione e la logica Save non rivede il codice XAML originale per ripristinare tali riferimenti all'output serializzato. In questo modo, qualsiasi valore ottenuto dalla risorsa o dal databound viene bloccato per essere l'ultimo valore usato dalla rappresentazione in fase di esecuzione, con solo capacità limitata o indiretta di distinguere tale valore da qualsiasi altro valore impostato localmente. Le immagini vengono serializzate anche come riferimenti agli oggetti delle immagini come sono nel progetto, anziché come riferimenti di origine originali, perdendo il nome del file o l'URI a cui era originariamente fatto riferimento. Anche le risorse dichiarate all'interno della stessa pagina vengono serializzate nel punto in cui vengono richiamate, anziché essere conservate come elemento chiave di una raccolta di risorse.
La gestione degli eventi non è preservata
Quando i gestori di eventi aggiunti tramite XAML vengono serializzati, non vengono preservati. XAML senza code-behind (e anche senza il meccanismo x:Code correlato) non ha modo di serializzare la logica procedurale del runtime. Poiché la serializzazione è autonoma e limitata all'albero logico, non esiste alcuna funzionalità per l'archiviazione dei gestori eventi. Di conseguenza, gli attributi del gestore eventi, sia l'attributo stesso che il valore stringa che denomina il gestore, vengono rimossi dal codice XAML di output.
Scenari realistici per l'uso di XAMLWriter.Save
Anche se le limitazioni elencate di seguito sono piuttosto sostanziali, esistono ancora diversi scenari appropriati per l'uso di Save per la serializzazione.
Output vettoriale o grafico: l'output dell'area sottoposta a rendering può essere usato per riprodurre lo stesso vettore o grafica quando viene ricaricato.
Testo RTF e documenti di flusso: il testo, la formattazione di tutti gli elementi e la loro disposizione all'interno vengono mantenuti nell'output. Ciò può essere utile per i meccanismi che approssimano una funzionalità degli Appunti.
Mantenimento dei dati degli oggetti business: se sono stati archiviati dati in elementi personalizzati, ad esempio dati XML, a condizione che gli oggetti business seguano le regole XAML di base, ad esempio la fornitura di costruttori personalizzati e la conversione per i valori delle proprietà per riferimento, questi oggetti business possono essere perpetuati tramite la serializzazione.
.NET Desktop feedback