2014-04-09 11 views
7

Ho due file .png aggiunti alle mie risorse di cui ho bisogno per accedere al proprio Uri quando si esegue il binding.Come ottenere un URI dell'immagine memorizzata nelle risorse

Il mio codice xaml è come segue:

<Grid> 
    <Image> 
    <Image.Source> 
     <BitmapImage DecodePixelWidth="10" UriSource="{Binding Path=ImagePath}"/> 
    </Image.Source> 
    </Image> 
</Grid> 

e il codice binding utilizzando ImagePath è:

ImagePath = resultInBinary.StartsWith("1") ? Properties.Resources.LedGreen : Properties.Resources.ledRed; 

Tuttavia

Properties.Resources.LedGreen 

restituisce un Bitmap anziché String contenente l'Uri di quella particolare immagine. Voglio solo sapere come estrarre quel valore senza la necessità di indirizzare un percorso dell'immagine nella directory che è memorizzata. (Che onestamente non sono sicuro sia una cosa giusta da fare in quanto non trovo alcuna situazione simile in rete).

Per favore fatemi sapere se esiste anche un metodo preferito per quello che sto cercando di usare se disponibile.

risposta

18

In un'applicazione WPF di solito non si memorizzano le immagini in Properties/Resources.resx e le si accede tramite la classe Properties.Resources.

Invece è sufficiente aggiungere i file di immagine al progetto di Visual Studio come file normali, magari in una cartella denominata "Immagini" o simili. Quindi devi impostare il valore da Build Action a Resource, operazione eseguita nella finestra Proprietà. Ci si arriva ad es. facendo clic con il tasto destro sul file immagine e selezionare la voce di menu Properties. Si noti che il valore predefinito di Build Action dovrebbe essere Resource per i file di immagine comunque.

Per accedere a queste risorse di immagine dal codice, utilizzare quindi uno Pack URI. Con quanto sopra nome della cartella "Immagini" e un file di immagine denominato "LedGreen.png", creando un tale URI sarebbe simile a questa:

var uri = new Uri("pack://application:,,,/Images/LedGreen.png"); 

Così si potrebbe forse dichiarare la vostra proprietà di essere di tipo Uri:

public Uri ImageUri { get; set; } // omitted INotifyPropertyChanged implementation 

e impostare in questo modo:

ImageUri = resultInBinary.StartsWith("1") 
     ? new Uri("pack://application:,,,/Images/LedGreen.png") 
     : new Uri("pack://application:,,,/Images/LedRed.png"); 

Infine il tuo XAML dovrebbe apparire come mostrato di seguito, che si basa sulla built-in conversione di tipo da Uri a ImageSource:

<Grid> 
    <Image Width="10" Source="{Binding Path=ImageUri}" /> 
</Grid> 
+0

Grazie per la risposta descrittiva e, soprattutto, un suggerimento sul modo giusto di farlo.Ho implementato la mia soluzione nel modo in cui mi hai suggerito, ma mi chiedo se devo portare e conservare queste immagini con l'eseguibile che consegnerò all'altra squadra? Poiché questo è un progetto abbastanza semplice, non ho intenzione di creare un programma di installazione per questo. – Mehrad

+1

No, l'azione di creazione 'Risorsa' aggiunge i file di immagine all'assieme. Quindi sono contenuti nell'eseguibile. – Clemens

1

Dichiarare la proprietà Properties.Resources.LedGreen come ImageSource e impostarla sulla posizione Uri anziché sull'oggetto Bitmap.

Oppure se si insiste per archiviarlo come bitmap, è possibile ottenere la fonte restituendo Properties.Resources.LedGreen.ImageSource che sarà di tipo ImageSource.

Preferirei il primo approccio.

Problemi correlati