2012-04-26 2 views
1

Je n'arrive pas à trouver un chemin relatif qui fonctionne pour ma ressource. J'ai essayé tout ce que je pouvais penser. La seule chose qui fonctionne est un chemin absolu qui est seulement correct sur mon système, mais serait incorrect dans n'importe quelle version déployée. Pour autant que je sache, ce chemin très simple devrait fonctionner.SourceURI relative ne fonctionne pas

public class GreyscaleEffect : ShaderEffect 
{ 
    private static PixelShader _pixelShader = new PixelShader() 
     { UriSource = new Uri("/Effects/Greyscale.ps", UriKind.Relative) }; 

Pour que je reçois l'erreur The type initializer for 'FSR.WPF.Utilities.UI. GreyscaleEffect' threw an exception. Exception interne: Cannot locate resource 'effects/greyscale.ps'.

J'ai aussi essayé les éléments suivants:

Uri(";component/Effects/Greyscale.ps", UriKind.Relative) 
Uri("/;component/Effects/Greyscale.ps", UriKind.Relative) 
Uri("/FSR.WPF.Utilities.UI;component/Effects/Greyscale.ps", UriKind.Relative) 

Ailleurs (dans un fichier XAML dans MUSUI), le chemin suivant est utilisé, et cela fonctionne bien:

<Image Source="/FSR.WPF.Utilities.UI;component/assets/CurrencyFlags/USD.png" 

Donc je ne peux pas comprendre pourquoi ce cas, qui est si semblable, ne fonctionne pas.

Seul le chemin absolu suivant fonctionne:

Uri("C:\TFS\MUS 6.1.x\Mosaic Middleware\FSR.WPF.Utilities\FSR.WPF.Utilities.UI" + 
    "\Effects\Greyscale.ps") 

J'ai aussi essayé tous les ci-dessus avec toutes les combinaisons d'utilisation @ devant la chaîne, en utilisant UriKind.Absolute, et en laissant le second paramètre tout à fait. Rien ne fonctionne mais le chemin absolu et je perds la tête.

Voici la structure de la solution. Le projet principal est MUSUI, en bas en gras. Cette classe d'effets et le fichier .ps se trouvent tous deux dans le dossier Effects qui se trouve à la racine d'un assembly référencé FSR.WPF.Utilities.UI.

enter image description here

Quoi qu'il en soit, je sais que cela doit travailler en quelque sorte. Toute personne capable de déterminer le chemin relatif le plus court possible, en particulier si elle ne nécessite pas de codage en dur dans le nom de l'assembly, obtient le prix.

Répondre

7

Vous ne pouvez pas spécifier d'URI relative, elle doit être absolue. Lorsque vous spécifiez un URI relatif dans XAML, il est en fait converti en un URI absolu en utilisant IUriContext.BaseUri, mais en code C# il n'y a pas d'informations sur l'emplacement actuel, donc vous ne pouvez pas utiliser un URI relatif.

Vous devez spécifier l'URI en utilisant le pack:// URI scheme:

UriSource = new Uri("pack://application:,,,/YourAssembly;component/Effects/Greyscale.ps"); 
+0

Soufflé à l'esprit. L'utilisation de ce chemin l'a corrigé. Maintenant, dans le cas où le nom de l'assembly de cette bibliothèque d'utilitaires change, existe-t-il un moyen de formater ce chemin tel qu'il utilise l'assembly auquel appartient la classe actuelle, puisque GreyscaleEffect.cs et Greyscale.ps seront toujours dans le même endroit? – Alain

+1

@Alain, oui, vous pouvez utiliser 'Assemblée.GetExecutingAssembly() 'pour obtenir l'assemblage actuel –

+0

Ohh j'adore la façon dont Intellisense rate ça, ça ne le sent pas du tout, rien ne dit que tous ceux qui sont tombés dans ce piège (selon leur chance) perdront quelques heures à revérifier et solutions de contournement d'essai jusqu'à atteindre cette solution. TY TY TY! C'est SPARTASOFT !!! pas Microsoft – EpiGen

0

Je pense que c'est le bug de classe PixelShader de WPF, car PixelShader n'implémenter l'interface IUriContext qui peut persister le contexte BaseUri, alors que System.Windows .Controls.Image & System.Windows.Documents.Hyperlink & System.Windows.ResourceDictionary, etc. IUriContext mettre en œuvre, de sorte qu'ils peuvent utiliser par rapport Uri

pour activer sensible Uri relatif PixelShader, peut utiliser un lien hypertexte comme redirecteur, pour exemple

<Window> 
    <Window.Resources> 
    <Hyperlink x:Key="ItemForRedirectKey" NavigateUri="{Your PixelShader.ps relative uri}" TargetName="{Binding Path= NavigateUri,RelativeSource={RelativeSource Self}}" /> 
    <PixelShader x:Key="PixelShaderKey" UriSource={Binding Path=TargetName,Source={StaticResouce ItemForRedirectKey} }/> 
    </Window.Resources> 
    </Window> 
Questions connexes