C# 为WPF中的TryFindResource提供回退值

C# 为WPF中的TryFindResource提供回退值,c#,wpf,localization,C#,Wpf,Localization,如果找不到资源,函数TryFindResource将返回null。 有没有办法为TryFindResource找不到的任何键提供一些回退值 我们有一个大项目,用包装器替换TryFindResource并不容易。 第一种方法是实现我们自己的ResourceDictionary并将其添加到MergedDictionaries中,但遗憾的是ResourceDictionary是一个类而不是一个接口,我们不能重写它的方法 因此,我正在寻找一种正确的方法,使TryFindResource在未知资源上不返回

如果找不到资源,函数TryFindResource将返回null。 有没有办法为TryFindResource找不到的任何键提供一些回退值

我们有一个大项目,用包装器替换TryFindResource并不容易。 第一种方法是实现我们自己的ResourceDictionary并将其添加到MergedDictionaries中,但遗憾的是ResourceDictionary是一个类而不是一个接口,我们不能重写它的方法


因此,我正在寻找一种正确的方法,使TryFindResource在未知资源上不返回null。

如果我得到正确的结果,那么您可以使用扩展,它允许您编写回退

  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";
        }
    }

侵入性最小的方法可能是扫描代码库并使用下面的扩展方法。在调用FindResource的任何位置,将其更改为findresourcex

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;
  }
}

这是行不通的,因为如果扩展方法的签名与现有实例方法匹配,编译器将始终选择实例方法。好主意。但是,在我的例子中,方法名称是不同的。你还预见到这个问题吗?如果名称不同的话就不会了。尽管我很确定OP是根据具体情况引用默认值的,这是针对.cs文件的。像这样的xaml怎么办。该资源通常会在MergeddictionAries中找到。考虑到XAML解析器会在StaticResource被not defined引用时引发异常,我认为它调用的是FindResource,而不是TryFindResource。所以你运气不好。