为 WPF 中的 TryFindResource 提供回退值

本文关键字:回退 TryFindResource WPF 中的 | 更新日期: 2023-09-27 18:36:49

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

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

所以我正在寻找一种正确的方法来使 TryFindResource 不会在未知资源上返回 null。

为 WPF 中的 TryFindResource 提供回退值

侵入性最小的方法可能是扫描您的代码库并使用下面的扩展方法。无论您在哪里调用FindResource,请将其更改为FindResourceEx

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

如果我做对了,那么你可以使用扩展,它允许你编写回退。

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