2012-05-01 13 views
12

Me gustaría cargar gráficos vectoriales almacenados como archivos XAML (archivos separados, no en un diccionario), incrustados en mi aplicación, y tengo algunas preguntas para hacerlo:Cargando gráficos vectoriales desde archivos XAML programáticamente en una aplicación WPF

  1. XAML se ve un poco ambigua, ya que puede ser usado para representar cualquiera de recursos estáticos, como imágenes vectoriales, o interfaces que están siendo construidos de forma dinámica como los de WPF. Debido a esto, el formato de una imagen vectorial XAML no está claro para mí: ¿cuál debería ser el elemento raíz, como la etiqueta "svg" para las imágenes del vector svg? Actualmente, estoy utilizando un lienzo como el elemento principal, ya que quiero trazar mis gráficos en otro lienzo.

  2. ¿Cuál es el mejor método para cargar esos archivos de forma programática (es decir, para crear el lienzo a partir de los archivos xaml)? He visto (y probado) diferentes soluciones con XamlReader, pero nada funcionó: la aplicación falla y el depurador no ayuda (la mayoría de los problemas que he encontrado parecen ocurrir durante el análisis, y el mensaje de error no estaba claro).

He leído http://learnwpf.com/post/2006/06/04/How-do-I-Include-Vector-Based-Image-Resources-in-my-WPF-Application.aspx, pero el enlace al artículo relativo a la carga de archivos de recursos está muerto, y las imágenes no se ha creado usando el código C#.

+12

Es fantástico que haya encontrado la solución y la haya compartido con todos, será más útil si puede agregar la solución como respuesta y aceptarla como Respuesta, en lugar de agregarla en la pregunta. – akjoshi

Respuesta

8

Vale, he encontrado la solución por mí y aquí está:

Mi proyecto se llama "Editor", y he colocado el archivo XAML quiero leer en una carpeta "gráficos". Este archivo se llama "Image.xaml". árbol El proyecto tiene el siguiente aspecto:

enter image description here

El archivo XAML en sí ejerce en este código:

<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> 

(se necesita referencia el XAML de espacio de nombres 'xmlns')

El código utilizado para cargar el archivo es:

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' es el nombre del lienzo principal de mi aplicación.

Última sutilidad: la propiedad 'BuildAction' del archivo * .xaml debe establecerse en 'Recurso', o encontrará una XamlParseException con valor hexadecimal 0x0C (para cambiar esta propiedad, haga clic derecho en el archivo en el proyecto treeview).

Espero que esto te pueda ayudar.

+0

¿Qué código usas en MainWindow.xaml para hacer referencia al C#? – Hoby

Cuestiones relacionadas