2016-10-11 8 views
3

WPF ResourceDictionary의 Source 속성에 대한 URI 작성을 단순화하는 태그 확장을 만들려고합니다.ResourceDictionary.Source 속성의 MarkupExtension

문제의 최소한의 예를하는 것은 다음입니다 :

CS :

public class LocalResourceExtension : MarkupExtension 
{ 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return new Uri("Resources.xaml", UriKind.Relative); 
    } 
} 

XAML :

<UserControl ...> 
    <UserControl.Resources> 
     <ResourceDictionary Source="{mw:LocalResource}" /> <!-- error MC3022 --> 
     <!-- <ResourceDictionary Source="Resources.xaml" /> --> <!-- Works fine --> 
    </UserControl.Resources> 
<!-- ... --> 
</UserControl> 

이 다음 오류와 함께 컴파일되지 않습니다 :

error MC3022: All objects added to an IDictionary must have a Key attribute or some other type of key associated with them. 

그러나 주석 확장 줄을 주석 달린 줄에 표시된대로 상수 값으로 바꾸면 모든 것이 잘됩니다.

마크 업 확장자가있는 버전이 작동하지 않는 이유는 무엇입니까? 거기에 대한 해결 방법이 있습니까? 내가 MSVC 2015

+1

''안에 넣으려고 했습니까? –

+0

@EdPlunkett 좋은 해결 방법입니다. 감사합니다. 생각하지 않았어. 그러나이 경우 내 확장 프로그램은 모든 용도에 4 줄을 더 추가하기 때문에 '단순화'하지 않습니다 ... – nevermind

+0

또한 디자인 타임에는 작동하지 않으므로 ResourceDictionary 요소가 파란 색으로 표시됩니다. 무해하지만 성가심. 실제 해결책은 필요로하는 내용을 병합하는 정규 리소스 사전을 작성하고이를 명시 적으로 포함하는 것입니다. –

답변

2

을 사용하고

이 나를 위해 노력하고 있습니다 :

public class LocalResource : MarkupExtension 
{ 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return new ResourceDictionary() { 
      Source = new Uri("Resources.xaml", UriKind.Relative) 
     }; 
    } 
} 

XAML

<Window.Resources> 
    <myNamespace:LocalResource /> 
</Window.Resources> 

XAML 편집기 블루 구불 거리는 곡선 <myNamespace:LocalResource />을 디자인 타임에의를 죽이고 디자인보기. 따라서 디자인보기를 사용하지 않는 경우에만 작동합니다. 나는하지 않지만 일부는 그렇다.

나는 내 여자 친구에게 내가 갈릴레오 이후 최고의 천재라고 말하면서, 그녀는 단지 나를 믿지 않는다. Galileo는 디자인 뷰를 작동시키는 방법을 발견했을 것입니다.

UPDATE

솔루션의 두 번째 :

public class LocalResourceDictionary : ResourceDictionary 
{ 
    public LocalResourceDictionary() 
    { 
     Source = new Uri("Resources.xaml", UriKind.Relative); 
    } 
} 

XAML

<Window.Resources> 
    <myNamespace:LocalResourceDictionary /> 
</Window.Resources> 

런타임에 제대로 작동의 SQUIGGLE 침묵하고, 디자이너가 작업 할 수 있습니다. 그러나 자동으로 디자인 모드에서 리소스 파일을 병합하지 못합니다. 아직 이상하지 않습니다.

UPDATE

영업 이익은 나보다 똑똑하다. 이것은 모든 것을 수행합니다 :

public class LocalResourceDictionary : ResourceDictionary 
{ 
    public LocalResourceDictionary() 
    { 
     Source = new Uri("pack://application:,,,/MyAssemblyName;component/Resourc‌​es.xaml", UriKind.Absolute); 
    } 
} 
+0

쿨! 두 번째 솔루션은 LocalResourceDictionary가 pack : //로 시작하는 절대 URI를 제공하는 경우에도 디자인보기에서 작동합니다. – nevermind

+0

@nevermind 신난다. 나는 팩을 만지작 거리려고했으나 제대로 작동시키지 못했습니다. 당신이 사용한 정확한 문자열은 무엇입니까? –

+1

'Source = new Uri ("pack : // application : ,,,/MyAssemblyName; component/Resources.xaml", UriKind.Absolute);'나를 위해 작동합니다. – nevermind