2009-07-10 9 views
15

Me gustaría poder utilizar gráficos vectoriales, preferiblemente definidos en XAML, como el control de la Fuente de una imagen, del mismo modo que actualmente puedo usar una imagen ráster como PNG. De esa manera podría fácilmente mezclar y combinar entre imágenes de mapa de bits y vectoriales, así:Uso de un archivo XAML como vector Fuente de imagen

<StackPanel> 
    <Image Source="Images/Namespace.png"/> 
    <Image Source="Images/Module.xaml"/> 
</StackPanel> 

Module.xaml lo más probable es que tenga <DrawingImage> como su elemento raíz en lugar de <UserControl>.

En realidad, lo que realmente voy a decir esto, así que mi modelo de vista puede seleccionar la imagen del vector, ya sea una trama o a su criterio:

<Image Source="{Binding ImageUri}"/> 

es esto posible? ¿Puede Image.Source cargar clases XAML desde un URI dado? ¿O solo puede cargar recursos de mapa de bits?

+4

Me pregunto ... ¿Por qué el uso de una imagen XAML en WPF/Silverlight sería tan difícil o no compatible de forma nativa ... teniendo en cuenta que WPF/Silverlight está basado en XAML! – Jacques

Respuesta

1

1) Agregue DrawingImage.xaml al proyecto y establezca sus propiedades en 'BuildAction = Content' y 'Copy Always'. O bien, puedes cargar dinámicamente el XAML desde afuera, ya que la lógica que voy a explicar también funcionará para loose-xaml.

2) un convertidor para convertir la URI XAML a UIElement, en su caso, será siempre DrawingImage

public class FileToUIElementConverter :IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     FileStream fileStream = new FileStream((string)parameter, FileMode.Open); 
     return XamlReader.Load(fileStream) as DrawingImage; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

3) Escribir el XAML de la siguiente manera

<Window.Resources> 
    <local:FileToUIElementConverter x:Key="uriToUIElementConverter"/> 
</Window.Resources> 
<Grid> 
    <Image Stretch="Fill" Source="{Binding Converter={StaticResource uriToUIElementConverter},ConverterParameter=ImageDrawing.xaml}"/> 
</Grid> 
+0

No creo que FileStream pueda cargar desde un recurso compilado (paquete: // URI), ¿o sí? –

+0

Probé la manera mencionada anteriormente y funcionó bien. –

+0

Hay un convertidor que maneja recursos aquí: http://stackoverflow.com/a/21588195/418362 – Artfunkel

8

Usted simplemente puede hacer referencia sus gráficos vectoriales como StaticResources:

<Image Source="{StaticResource MyImage}" /> 

Almacenar las imágenes en un ResourceDict ionary como DrawImage's. Expression Blend puede ayudarle a generar estas cosas:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <DrawingImage x:Key="MyImage"> 
     <DrawingImage.Drawing> 
     <DrawingGroup> 
      <DrawingGroup.Children> 
       <GeometryDrawing Brush="Black" Geometry="M 333.393,... 100.327 Z "/> 
       <GeometryDrawing Brush="Black" Geometry="F1 M 202.309,... Z "/> 
         : 
      </DrawingGroup.Children> 
     </DrawingGroup> 
    </DrawingImage.Drawing> 
    </DrawingImage> 

</ResourceDictionary> 
+0

Claro. Sin embargo, no me ayuda con el escenario de enlace de datos (al menos no directamente). –

1

Insertar el XAML de recursos (DrawingImage) con 'recursos' tipo. Entonces no es un archivo separado y se puede referenciar directamente a través de un URI, como en el ejemplo original, PERO el URI no es trivial. Tienes que descubrir la sintaxis de URI de "paquete" de Microsoft y usar eso.

+0

No está documentado, pero las partes internas del URI "paquete" no se cargan en la memoria hasta _después_ de que se crea la instancia de su primer UIElement. Por lo tanto, intentar usarlo en App.cs (antes de que se haya cargado su MainWindow.xaml) es bastante frustrante. En cambio, úselo en su controlador MainWindow_Load. –

Cuestiones relacionadas