2013-10-25 2 views
0

TryFindResource 함수는 리소스를 찾을 수없는 경우 null을 반환합니다. TryFindResource에서 찾을 수없는 키에 대체 값을 제공 할 수 있습니까?WPF에서 TryFindResource 대체 값 제공

우리는 큰 프로젝트를 가지고 있으며 TryFindResource를 래퍼로 대체하기가 쉽지 않습니다. 첫 번째 방법은 자체 ResourceDictionary를 구현하여 MergedDictionaries에 추가하는 것이었지만 ResourceDictionary는 인터페이스가 아닌 클래스이며 메서드를 재정의 할 수 없습니다.

그래서 TryFindResource가 알 수없는 리소스에서 null을 반환하지 않도록하는 적절한 방법을 찾고 있습니다.

답변

1

최소 침입 방법은 코드베이스를 스윕하고 아래의 확장 방법을 사용합니다. 어느 곳에서든지 FindResourceFindResourceEx으로 변경하십시오.

public static class FrameworkElementExtensions 
{ 
    public static Object TryFindResourceEx(this FrameworkElement el, Object resourceKey) 
    { 
    var result = el.FindResource(resourceKey); 

    if(result == null) 
    { 
     // fallback handling here 
    } 

    return result; 
    } 
} 
+0

이것은 .cs 파일 용입니다. .xaml에서 무엇을할까요? <이미지 ToolTip = "{StaticResource GoBack}"/> 이 리소스는 일반적으로 MergedDictionaries에 있습니다. – norekhov

+1

StaticResource가 정의되어 있지 않은 경우 XAML 파서가 예외를 throw한다는 것을 고려하면 TryFindResource가 아닌 FindResource를 호출하는 것입니다. 그래서 너는 운이 없어. –

0

올바르게 입력하면 대체 기능을 사용하여 폴백을 쓸 수 있습니다.

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      var resource= Application.Current.TryFind("ApplicationResource"); 
     } 
    } 

    public static class ApplicationExtension 
    { 
     public static Object TryFind(this Application application,string resourceName) 
     { 
      return Application.Current.TryFindResource(resourceName) ?? "Your fall back resource"; 
     } 
    } 
+0

확장 메서드의 서명이 기존 인스턴스 메서드와 일치하면 컴파일러에서 항상 인스턴스 메서드를 선택하기 때문에 작동하지 않습니다. –

+0

좋은 생각. 그러나, 제 경우에는 메소드 이름이 다릅니다. 아직도 문제를 예측합니까? – Nair

+0

이름이 다른 경우가 아닙니다. 비록 제가 OP가 사안별로 기본값을 언급하고 있다고 확신합니다. –