2009-07-10 24 views
15

Vorrei poter utilizzare la grafica vettoriale, preferibilmente definita in XAML, come origine di un controllo Immagine, proprio come posso attualmente utilizzare un'immagine raster come un PNG. In questo modo ho potuto facilmente combinare tra il bitmap e vettoriali immagini, in questo modo:Utilizzo di un file XAML come vettore Image Source

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

Module.xaml avrebbe molto probabilmente <DrawingImage> come il suo elemento principale al posto di <UserControl>.

In realtà, quello che sto davvero andando per è questo, quindi il mio ViewModel possibile selezionare sia un vettore di immagine raster o, a sua discrezione:

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

è possibile? Image.Source può caricare le classi XAML da un dato URI? O è solo in grado di caricare risorse bitmap?

+4

Mi chiedo ... Perché usare un'immagine XAML in WPF/Silverlight è così difficile, o non supportato in modo nativo ... considerando che WPF/Silverlight è basato su XAML! – Jacques

risposta

1

1) Aggiungere il progetto Drawing.xaml al progetto e impostarne le proprietà su "BuildAction = Content" e "Copy Always". Oppure puoi caricare dinamicamente XAML dall'esterno poiché la logica che sto per spiegare funzionerà anche per loose-xaml.

2) Converter per convertire l'URI XAML per UIElement, nel tuo caso, sarà sempre 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) Scrivere il codice XAML, come di seguito

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

Non penso che FileStream possa caricare da una risorsa compilata (pacchetto: // URI), può? –

+0

Ho provato il modo sopra citato e ha funzionato bene. –

+0

C'è un convertitore che gestisce le risorse qui: http://stackoverflow.com/a/21588195/418362 – Artfunkel

8

Si può semplicemente fare riferimento grafica vettoriale come StaticResources:

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

Archiviare le immagini in un ResourceDict ionario come DrawImage. Expression Blend può aiutare a generare questa roba:

<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

Sicuro. Non mi aiuta con lo scenario del databinding, sebbene (almeno non direttamente). –

1

incorporare la risorsa XAML (DrawingImage) con il tipo di 'Resource'. Non è quindi un file separato e può essere referenziato direttamente tramite un URI, come nell'esempio originale - MA l'URI non è banale. Devi capire la sintassi URI "pack" di Microsoft e usarla.

+0

Non è documentato, ma gli interni URI "pack" non vengono caricati in memoria fino a quando _after_ istanzia il tuo primo UIElement. Quindi, provare ad usarlo in App.cs (prima che il tuo MainWindow.xaml sia stato caricato) è piuttosto frustrante. Invece, usalo nel tuo gestore MainWindow_Load. –

Problemi correlati