2011-10-14 9 views
6

La mia domanda è: sto leggendo MSDN sbagliato O MSDN è sbagliato? Sto cercando di fare riferimento a un'immagine Risorsa tramite URI relativo.Wpf URI assoluti vs. Relative Pack

La pagina di MSDN intitolato pack URI in WPF afferma chiaramente che:

"File di risorse in sottocartella di assemblaggio locale" = "/Subfolder/ResourceFile.xaml"

nella Tabella 2: URI relativi in ​​markup (qui http://msdn.microsoft.com/en-gb/library/aa970069.aspx).

Così, ho creato nuovi progetti WPF/.NET 4.0 in Vs2010 (v10.0.40219.1 SP1Rel) per testare.

Startup Project: TryUri 
    App.xaml 
    MainWindow.xaml 
Custom Ctrl Project: TryUri.CCL 
    Icons/folder.png <-- Marked As Resource! 
    Views/TestUC.xaml 

In TestUC.xaml:

<Canvas> 
    <Border> 
     <Image Source="/Icons/folder.png" Height="Auto" Width="Auto" /> 
    </Border> 
</Canvas> 

In MainWindow.xaml:

// xmlns:uc="clr-namespace:TryUri.CCL.Views;assembly=TryUri.CCL" 

<uc:TestUC /> 

Risultato: L'immagine non rivela !!

Quando cambio il percorso in "../Icons/folder.png" Funziona.

Se copio Icons/folder.png nella cartella TryUri.CCL/Views /, quindi "Icons/folder.png" funziona.

Tuttavia, non riesco mai a far funzionare una barra in avanti come in "/Icons/folder.png" come afferma MSDN.

+0

La mia ipotesi è che la directory di lavoro sia impostata in modo errato nel progetto. Lo controllerei prima. –

+0

La directory di lavoro avrebbe importanza se stavo cercando di accedere al png come file. Non lo sono, è contrassegnato come una risorsa. Ho aggiornato la domanda per chiarirlo. Grazie. –

+0

Ho auto-risposto di seguito. Per il mio progetto ho scelto di utilizzare semplicemente i percorsi relativi al markup (cioè "../icons/folder.png") poiché questa è la scelta più semplice IMO. –

risposta

12

La ragione, quando si esegue come un assembly separato, che il relativo pacchetto URI deve iniziare con ../ o senza backslash è a causa di come URI relativi sono utilizzati, from MSDN (emphasis mine):

assoluto vs. relativa pack URI

...

Se viene utilizzato un leader barra rovesciata, tuttavia, il relativo pacchetto URI di riferimento è quindi considerata relativo alla radice dell'applicazione.

Quindi se vuoi le immagini di rimanere relativo alla vostra assembly di riferimento, basta omettere lo slash iniziale o utilizzare ../ se in una sottocartella.

Vedere l'immagine sotto per un esempio di come questo appare in fase di esecuzione:

Absolute vs. Relative Pack URIs

+0

Ho provato questo e non funziona con una barra principale. Devo usare "Icons/folder.png" perché funzioni. –

+0

Grazie per l'aggiornamento. Puoi commentare con un link al tuo codice? Sono curioso di sapere come hai funzionato. Inoltre, sembra che tu abbia lasciato TestUC e TestUC2.xaml nella cartella/Views di WpfControlLibrary1 in modo contrario alla tua risposta. –

+0

Sto rivedendo la mia risposta, credo che '..' sia richiesto a causa di come il tuo' UserControl' viene usato in fase di esecuzione. – user7116

4

Basta sostituire < NomeApplicazione> con il nome della vostra applicazione e questo dovrebbe funzionare

Source="/<ApplicationName>;component/Icons/folder.png" 
+1

Grazie. So che funzionerà, ma voglio sapere perché MSDN dice che posso semplicemente fare "/Subfolder/Resource.file-ext". –

7

La risposta è questa: La barra principale in un percorso relativo risolve sempre al gruppo principale, non l'assemblea

Per farlo funzionare come afferma MSDN, dovrei memorizzare tutte le icone in una cartella "Icone /" nell'assembly principale, anziché nella DLL di controllo personalizzata.

Se si sceglie di archiviare le risorse nell'assieme dll in una cartella "Icone /", è necessario fare riferimento a esse con un percorso relativo alla marcatura su cui si sta lavorando (ad esempio "../Icons/folder.png") OPPURE è necessario qualificare percorso con il nome dell'assembly (ad esempio "/AssemblyName;component/Icons/folder.png")