2009-11-25 3 views
11

액세스) 또는 심지어 응용 프로그램. StaticResource 바인딩 표현식은 요소 트리를 걸어 다니는 방법을 알고 있거나 요소 자체가하는 것처럼 보입니다. 프로그래밍 방식으로 똑같은 일을하고 싶습니다 :는, 프로그램 내가 프로그래밍 방식으로 내가 XAML에서와 같이 많은 정적 리소스에 액세스하고 싶은 실버 정적 자원

<UserControl x:Class="MyCustomControl" ...> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Resources.xaml"/> <!-- Sets 'My.Text.Key' to System.String 'Hello, World!' --> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </UserControl.Resources> 
</UserControl> 

public partial class MyCustomControl 
{ 
    public MyCustomControl() 
    { 
     InitializeComponent(); 
     string myCustomValue = this.Resources[MyCustomValue] as string; // myCustomValue becomes null! 
    } 
} 

심지어이 간단한 테스트에서 내 리소스는 프로그래밍 방식으로 액세스 할 수없는 것 같습니다. 그리고 이것은 내가 실제로하려고했던 단순화 된 버전입니다 : 사용자 정의 동적 속성이 첨부 된 요소 (예 : uiElement.Resources [key])를 통해 정적 리소스를 찾습니다.

+0

"점"을 내 키 (예 : "MyTestKey"대신 "MyTestKey")로 가져 가면 프로그래밍 방식으로 리소스를 볼 수 있습니다 .XAML 또는 코드에서 리소스 이름 지정에 대한 규칙이 있습니까? -behind? – Trinition

답변

17

반대로 귀하의 의견에도 불구하고 나는 "." 귀하의 리소스 키에 정말 문제의 원천입니다. 이 상황에서 "." 특별한 의미가 없으며 자원 액세스 방법에 영향을 미치지 않습니다. (나는 그것으로 어떤 문제도 재현하지 못하고 시도했다).

{StaticResource MyName} 마크 업 확장 프로그램을 사용하는 것과 프로그램 방식으로 리소스를 찾으려는 시도 사이에 큰 차이가 있습니다.

태그 확장을 사용하면 XamlParser가 의 Resources 속성이 지정된 키를 찾게됩니다. 키를 찾지 못하면 부모 FrameworkElement에서 찾은 다음 루트 FrameworkElement에 도달 할 때까지 계속됩니다. 여전히 발견되지 않으면 응용 프로그램의 Resources 속성에 모양이 있습니다.

한편

이 코드 : -

string myCustomValue = this.Resources[MyCustomValue] as string; 

김포 그냥 사용자 제어를위한 하나의 자원 속성에 찾고. 조상 또는 응용 프로그램 자원에서 키를 h 제하려고 시도하지 않습니다. 그것의 간단한 사전 조회. 이게 내가 너를 위장하는 이유라고 생각해.

나는 "사용하고 있다고 말할 것"이라고 말했습니다. 리소스 키에있는 것이 좋은 생각이 아닐 수도 있습니다. "." 다양한 XAML 시나리오에서 이미 의미가 있습니다. 따라서 Silverlight가 코드에 매우 만족하더라도 코드를 읽는 개발자를 혼동시킬 가능성이 있습니다.

+0

대답은 내가 찾고있는 정답이다 : XAML 파싱 타임 리소스 룩은 계층 적이다. 반면에 프로 그래머 리소스 액세스는 그렇지 않다. XAML 파서가 사용하는 계층 적 논리가 프로그래밍 방식으로도 사용되기를 바란다. 그래도 도트가 문제가 될 것이라고 확신하지 못합니다. 그리고 도트는 ReSharper에 문제를 일으 킵니다. 구문 강조를 혼동합니다. 의도적으로 도트를 사용한다는 것은 리소스를 의사 - 네임 스페이스를 사용하여 각 프리즘 모듈이 리소스를 정의하고 coll에 연결할 수 없습니다. 다른 모듈들과 함께. – Trinition

관련 문제