2012-05-01 5 views
12

Vorrei caricare la grafica vettoriale memorizzata come file XAML (file separati, non in un dizionario), incorporata nella mia applicazione e ho alcune domande per farlo:Caricamento di grafica vettoriale da file XAML in modo programmatico in un'applicazione WPF

  1. XAML sembra un po 'ambigua, poiché può essere utilizzata per rappresentare sia risorse statiche come immagini vettoriali o interfacce che vengono dinamicamente costruiti come quelli in WPF. Per questo motivo, il formato di un'immagine vettoriale XAML non mi è chiaro: quale dovrebbe essere l'elemento radice, come il tag "svg" per le immagini vettoriali svg? Al momento, sto usando una tela come elemento principale poiché desidero plottare la mia grafica su un'altra tela.

  2. Qual è il metodo migliore per caricare questi file in modo programmatico (cioè per creare la tela dai file xaml)? Ho visto (e provato) diverse soluzioni con XamlReader, ma non ha funzionato: l'app si blocca e il debugger non aiuta (molti problemi che ho riscontrato sembrano verificarsi durante l'analisi e il messaggio di errore non è chiaro).

ho letto http://learnwpf.com/post/2006/06/04/How-do-I-Include-Vector-Based-Image-Resources-in-my-WPF-Application.aspx, ma il link per l'articolo che fare con i file di risorse di carico è morto, e le immagini non vengono create utilizzando il codice C#.

+12

È fantastico che tu abbia trovato la soluzione e condivisa con tutti, sarà più utile se puoi aggiungere la soluzione come risposta e accettarla come Risposta, invece di aggiungerla nella domanda. – akjoshi

risposta

8

Va bene, ho trovato la soluzione da me e qui è:

Il mio progetto si chiama "Editor", e ho inserito il file XAML voglio leggere in una cartella "Grafica". Questo file è chiamato "Image.xaml". Il progetto albero assomiglia a questo:

enter image description here

Il file XAML a sua volta detiene questo codice:

<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     Width="40" Height="40"> 
    <Rectangle Canvas.Left="0" Canvas.Top="0" Fill="White" Stroke="Black" StrokeThickness="1" Height="40" Width="40" /> 
    <!-- ... --> 
</Canvas> 

(è necessario il riferimento XAML namespace 'xmlns')

Il codice utilizzato per caricare il file è:

StreamResourceInfo sr = Application.GetResourceStream(new Uri("Editor;component/Graphics/Image.xaml", UriKind.Relative)); 
Canvas result = (Canvas)XamlReader.Load(new XmlTextReader(sr.Stream)); 
layoutRoot.Children.Add(result); 

'layoutRoot' è il nome della tela principale della mia applicazione.

Ultima sottilità: la proprietà 'BuildAction' del file * .xaml deve essere impostata su 'Risorsa', o si incontrerà una XamlParseException con valore esadecimale 0x0C (per modificare questa proprietà, fare clic con il tasto destro del mouse sul file nel progetto treeview).

Spero che questo possa essere d'aiuto.

+0

Quale codice usi in MainWindow.xaml, per fare riferimento al C#? – Hoby