2012-04-26 5 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" 

왜 이와 비슷한이 사건이 효과가 없는지 알아봐라.

만 다음과 같은 절대 경로가 작동 : 나는 또한, 문자열의 앞에 @을 사용 UriKind.Absolute을 사용하고 두 번째 매개 변수를 떠나 모든 조합으로 위의 모든 시도했습니다

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

전부. 아무것도 작동하지 않지만 절대 경로와 나는 내 마음을 잃고있어.

다음은 솔루션 구조입니다. 메인 프로젝트는 굵은 글씨의 맨 아래에있는 MUSUI입니다. 이 효과 클래스와 .ps 파일은 모두 참조 된 어셈블리 FSR.WPF.Utilities.UI의 루트에있는 Effects 폴더에 있습니다.

enter image description here

어쨌든,이 어떻게 든 일을하는 것을 알고있다. 가능한 가장 짧은 상대 경로를 알아낼 수있는 사람은 누구나, 특히 어셈블리 이름에 하드 코딩을 요구하지 않으면 상금을 얻습니다.

답변

7

상대 URI를 지정할 수 없으며 절대적이어야합니다. XAML에서 상대 URI를 지정하면 실제로는 IUriContext.BaseUri을 사용하여 절대 URI로 변환되지만 C# 코드에는 현재 위치에 대한 정보가 없기 때문에 상대 URI를 사용할 수 없습니다.

당신은 사용하여 URI를 지정해야 pack:// URI scheme :

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

마인드가 날아갔습니다. 이 경로를 사용하여 고정했습니다. 이제이 유틸리티 라이브러리의 어셈블리 이름이 변경된 경우 GreyscaleEffect.cs 및 Greyscale.ps가 항상이 클래스에 속할 것이므로 '현재 클래스가 속한 어셈블리'를 사용하는 경로를 포맷하는 방법이 있습니까? 같은 장소? – Alain

+1

@Alain, 네, 어셈블리를 사용할 수 있습니다.GetExecutingAssembly()'현재 어셈블리를 얻으려면 –

+0

오, Intellisense가 그리워하는 방식을 좋아합니다. 전혀 감지하지 못합니다.이 함정에 빠진 모든 사람 (행운에 따라 다름)이 다시 확인하고 이 솔루션에 도달 할 때까지 시행 착오를 피하십시오. 타이 타이! 이것은 스파르타입니다! 마이크로가 아니야 – EpiGen

0

내가 PixelShader이 System.Windows 동안 기저 URI에 컨텍스트를 유지할 수 있습니다 IUriContext 인터페이스를 구현하지 않기 때문에이, WPF의 PixelShader 클래스 버그라고 생각합니다 등 .Controls.Image & System.Windows.Documents.Hyperlink & System.Windows.ResourceDictionary은 IUriContext를 구현하고, 그래서 그들은 들어, 리디렉터로 하이퍼 링크를 사용하여 민감한 PixelShader 상대 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> 
관련 문제