2009-02-03 2 views
4

WPF에 CustomControl을 쓰고 있습니다. 내 테마/Generic.xaml, resourcedictionary 수준에서 x : Key가 할당 된 일부 DataTemplates가 있습니다.Findresource가있는 리소스를로드하면 예외가 발생합니다. - WPF/C#

이제 동일한 제어 클래스 코드 내에서 코드에서 동적으로 수행 할 수 있도록 해당 자원을 찾아로드하려고합니다.

I가 기지/this.FindResource ("키 값") 등 this.Resources [ ","]을 시도

그것은 리소스가 발견되지 않는 것으로 복귀 따라서 널 유지한다.

리소스가 generic.xaml에 있습니다.

도와주세요.

답변

0

Im 확실하지 않습니까? XAML에서 XAML을 정의하거나 새로운 x : Key를 사용하여 정적 리소스를 정의해야 할 필요가 있다고 생각하십니까?

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="SomeTemplate.xaml"/> 
</ResourceDictionary.MergedDictionaries> 

당신의 자원

HTH, 에릭

을 시도하고 찾아 내기 위하여려고하고 적절한 장소에 :이 같은 자원을 병합 템플릿이 포함 된 파일을 사용하는 경우

또 다른 옵션은

1

사용자 정의 컨트롤을 작성하기 때문에 generic.xaml 파일에 ControlTemplate이 정의되어 있다고 가정합니다. 이 같은의 ControlTemplate의 리소스 섹션에 DataTemplate을 (들)을 추가하는 경우 그렇다면, 다음 :

<ControlTemplate> 
    <ControlTemplate.Resources> 
     <!-- Data Templates Here --> 
    </ControlTemplate.Resources> 

    <!-- Rest of Control Template --> 
</ControlTemplate> 

다음 컨트롤 템플릿이 적용되었는지 제공 /로드 한 후 해당 데이터를 찾을 수 있습니다 귀하의 컨트롤 내에서 this.FindResource()에 대한 호출을 사용하여 템플릿을 만듭니다.

0

둘 다에 Thnaks.

리소스를 CT의 리소스 섹션으로 옮겨 보았습니다. 심지어 OnApplyTemplate 또는 EndInit() 등에서 런타임을 살펴볼 때 this.Resources에는 객체가 없습니다 .-((비록 모든 것이 컨트롤의 Generic.xaml이지만)

그래서 null을 반환합니다.

3

실제로 FindResource를 사용하기 전에 다른 컨트롤에 자식 컨트롤을 추가했는지 확인하십시오. FindResource를 사용할 때 발견 될 때까지 컨트롤 계층을 올라간다는 것을 확신합니다. 일치하는 항목이 없으면 찾고있는 리소스를 찾을 수 없습니다.

6

답변에 약간 늦지 만 다른 사람들에게 도움이 될 수 있습니다.

액세스하려는 리소스가 어느 곳이 ComponentResourceKey에 의해 식별 될해야합니다 어셈블리에서 액세스 할 테마 수준에서 입니다 :

<Style TargetType="{x:Type TreeViewItem}" x:Key="{ComponentResourceKey {x:Type local:MyTVIStyleSelector}, tviBaseStyle}"> <!-- style setters --> </Style> 

것은 다음 XAML 당신이 참조 할 것

<Style TargetType="{x:Type TreeViewItem}" 
     x:Key="{ComponentResourceKey {x:Type local:MyTVIStyleSelector}, tviStyle_1}" 
     BasedOn={StaticResource {ComponentResourceKey {x:Type local:MyTVIStyleSelector}, tviBaseStyle}}> 
    <!-- style setters --> 
</Style> 

과 같은 코드에서 : 그것은이 같은

ComponentResourceKey key = new ComponentResourceKey(typeof(MyTVIStyleSelector), "tviStyle_1"); 
Style style = (Style)Application.Current.TryFindResource(key); 
TypeInTargetAssembly이 다른이 자원에 대한 액세스를 제한하지 않는 설정해야합니다 비록

<Style TargetType="{x:Type TreeViewItem}" 
     x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:MyTVIStyleSelector}, ResourceId=tviBaseStyle}"> 
    <!-- style setters --> 
</Style> 

참고 :

은 다음과 같습니다 (하지만 그냥 같은 것) XAML 구문의 자세한 형태가있다 어셈블리 형식.

+0

이 기술이 좀 도와 수 ? http://stackoverflow.com/questions/14528622/find-resource-from-generic-xaml-programmatically/14528823#14528823 나는 Generic.xaml에서 리소스의 인스턴스를 찾으려고합니다. –

+0

+1 - 중대한 답변 – Doug

1

x : 키와 데이터 유형은 상호 배타적입니다. 내부적으로 DataType을 설정하면 WPF는 DataTemplateKey 유형의 키를 생성합니다. 따라서이 키를 사용하여 리소스를 찾을 수 없기 때문에 ComponentResourceKey가있는 FindResource를 호출하면 예외가 발생합니다. X와 DataTemplate을 정의 또는

frameworkElement.FindResource(new ComponentResourceKey(typeof(yourType), "ressId")); 

{yourType : 지방 유형 X} : 데이터 형식 =와 DataTemplate을 위해

frameworkElement.FindResource(new DataTemplateKey(typeof(yourType))); 

를 사용하여 키 = {ComponentResourceKey TypeInAssembly = {X : L 형 : yourType를 }, ResourceId = ressId}가 정의되었습니다. 같은 템플릿에 DataType과 x : Key를 정의하지 마십시오.

2

당신은이 같은 리소스 사전로드 할 수 있습니다

ResourceDictionary myDictionary = Application.LoadComponent(new Uri("/MyAssembly;component/Themes/Generic.xaml", UriKind.RelativeOrAbsolute)) as ResourceDictionary; 

그런 다음 일반적인 방법으로 그 안에서 리소스를 찾을 수 있습니다, 예를, 내 사전은 [ "키 값"]

관련 문제