2012-04-26 11 views
1

私のリソースで動作する相対パスを把握することができません。私は考えることができるすべてを試しました。動作する唯一の方法は、システム上で正しいだけの絶対パスですが、展開されたバージョンでは間違っています。相対ソースが動作しない

私が知る限り、この非常に簡単な方法が有効です。私はエラーThe type initializer for 'FSR.WPF.Utilities.UI. GreyscaleEffect' threw an exception.内部例外を取得これについて

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

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) 

を別の場所(MUSUIでXAMLファイルで)、次のパス:Cannot locate resource 'effects/greyscale.ps'.

は、私はまた、次のことを試してみましたが使用され、正常に動作します:

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

似たようなこのケースがなぜ機能しないのかを理解してください。

のみ、次の絶対パスが機能:

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

私はまた、文字列の前に@を使用してUriKind.Absoluteを使用して、2番目のパラメータを除外のあらゆる組み合わせで上記のすべてを試してみました全部。何も動作しませんが絶対パスと私は私の心を失っています。

解決策の構造は次のとおりです。 MainプロジェクトはMUSUIで、下の太字で表示されています。このエフェクトクラスと.psファイルは両方とも、参照されるアセンブリFSR.WPF.Utilities.UIのルートにあるEffectsフォルダにあります。

enter image description here

とにかく、私はこれは何とか動作するように持って知っています。可能な最短の作業相対パスを特定できる人は、特にアセンブリ名でハードコーディングを必要としない場合は、賞金を得ることができます。

答えて

7

相対URIを指定することはできません。絶対URIでなければなりません。 XAMLで相対URIを指定すると、実際にはIUriContext.BaseUriを使用して絶対URIに変換されますが、C#コードでは現在の場所に関する情報がないため、相対URIは使用できません。

あなたはpack:// URI schemeを使用してURIを指定する必要があります。

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

マインドブローこのパスを使用して固定しました。さて、このユーティリティライブラリのアセンブリ名が変更された場合、GreyscaleEffect.csとGreyscale.psは常に現在のクラスに属しているので、このパスをフォーマットして '現在のクラスが属するアセンブリ'を使用する方法があります同じ場所? – Alain

+1

@Alain、はい、あなたは 'Assembly 'を使うことができます。GetExecutingAssembly() '現在のアセンブリを取得する –

+0

私はIntellisenseがこれを逃している方法が大好きです。これは全く意味がありません。何も言わないので、このトラップに陥った人は(運に応じて)再検査し、このソリューションに到達するまで試用回避策を実行します。 TY TY TY!これはスパルタソフ!!!マイクロソフトではない – EpiGen

0

System.WindowsながらPixelShaderは、BASEURIコンテキストを保持することができIUriContextインタフェースを実装していないので、私は、これはWPFのPixelShaderクラスのバグだと思います等.Controls.Image & & System.Windows.Documents.Hyperlink System.Windows.ResourceDictionaryは、IUriContextを実装するので、彼らはのために、リダイレクタとしてハイパーリンクを使用することができ、敏感PixelShader相対URIを有効にするには相対URI

を使用することができ例

<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> 
関連する問題