2011-11-23 2 views
0

UserControl에서 파생 된 사용자 지정 WPF 컨트롤이 있습니다. 내 XAML 파일의 리소스 섹션에는 사용자 지정 컨트롤에 표시 될 항목에 대해 정의 된 여러 가지 템플릿과 스타일이 있습니다.TryFindResource에서 리소스를 찾을 수 없습니다.

여기 내 스타일 중 하나에 대해 아래쪽 화살표를 그리는 정의입니다.

<Style x:Key="ArrowStyle" TargetType="Path"> 
     <Setter Property="Margin" Value="4"/> 
     <Setter Property="Stretch" Value="Uniform"/> 
     <Setter Property="HorizontalAlignment" Value="Center"/> 
     <Setter Property="VerticalAlignment" Value="Center"/> 
     <Setter Property="Data" Value="M 0 0 L 5 5 L 10 0 Z"/> 
     <Setter Property="Fill" Value="{DynamicResource FormText}"/> 
    </Style> 

그래서 버튼에서 파생 된 맞춤 buttom 개체가 있습니다. 기본적으로 화살표를 표시하는 작은 정사각형 버튼입니다. 내 사용자 지정 단추에 대한 내 생성자에서 다음 코드가 있습니다.

 Path Arrow = new Path(); 
     Arrow.Style = TryFindResource("ArrowStyle") as Style; 

그러나 TryFindResource를 호출하면 리소스를 찾을 수 없다는 메시지가 나타납니다. 정의 된 스타일을 App.xaml로 옮기면 찾지 만 커스텀 컨트롤 리소스 일 때 찾지 않습니다.

내가 잘못했거나 누락 되었습니까?

업데이트

사용자 정의 사용자 컨트롤에있는 않습니다 위해 내가 TryFindResource를 호출하고 사용자 정의 버튼을 누릅니다. 그러나 사용자 지정 단추의 생성자에서 TryFindResource를 호출하기 때문에 실제로 TryFindResource가 호출 될 때 사용자 지정 컨트롤에 상주하지 않습니다. 사용자 지정 단추가 만들어지면 사용자 지정 사용자 정의 컨트롤에 추가됩니다. 아마도 TryFindResource를 배치하는 다른 방법이나 장소가 있으므로 버튼이 컨트롤에 속한 후에 호출됩니다.

답변

7

TryFindResource는 루트 요소에 도달 할 때까지 상위 요소까지 논리 트리를 위쪽으로 탐색합니다.

그런 다음 응용 프로그램 리소스가 확인됩니다. 그것은 두 번째 시도에 넣은 것이고 거기에서 발견 되었기 때문에 일했습니다.

"TryFindResource ("ArrowStyle ")라고 말하면 부모 요소의 화살표 스타일을 창 리소스와 응용 프로그램 리소스 (전역 리소스)까지 검색합니다. 사용자 지정 단추 개체에서 호출하면 당신의 ArrowStyle 자원이 위의 조건을 만족하지 않기 때문에 그것을 찾을 수 없습니다.

을 당신은 당신의 "정의의 WPF UserControl에서 파생 된 컨트롤"또는 그 자손에 전화를해야합니다.

을 내가하면 생각 응용 프로그램 자원으로 이동하거나 모든 전역 자원 (스타일)을 가진 응용 프로그램 자원에 자원 사전을 추가하면됩니다.

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="....Your resources.xaml"/> 
      <ResourceDictionary Source="....Your resources.xaml"/> 
      <!-- Place further resources here --> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 
0

XAML의 리소스 섹션에 스타일이 정의되어 있다고 가정하면 단추가있는 창이나 사용자 정의 컨트롤에 있다고 가정합니다.

단추에서 리소스를 찾으려면 부모를 가져 와서 TryFindResource를 호출하는 논리 트리를 찾아야합니다. 그렇지 않으면 버튼을 사용하거나 App.xaml에 스타일을 지정하는 것 외에는 할 수 없습니다.

0

일반적으로 리소스를로드하기 좋은 곳은 생성자 대신 OnApplyTemplate 재정의 또는 Loaded 이벤트 처리기입니다. 이렇게하면 XAML에서 리소스 참조를 추가 할 때처럼 동작합니다. 컨트롤이 구성되어 비주얼 트리에 추가 된 다음 부모 개체의 리소스에서 선언 된 모든 위치에서 리소스를 확인하려고 시도합니다.올바르게 말한 것처럼 생성자가 버튼을 실행하면 부모 컨트롤에 아직 추가되지 않았으므로 스타일을 아직 볼 수 없습니다.

관련 문제