简化wpf中的资源字典寻址

Simplify resource dictionary addressing in wpf

让我这样描述问题 我已经创建了一个自定义控件,用户可以通过这种方式使用自定义控件

<ResourceDictionary.MergedDictionaries>
  <ResourceDictionary Source="/customControl;component/ThemeResources/Light.xaml"/>
  <ResourceDictionary Source="/customControl;component/ThemeResources.xaml"/>
</ResourceDictionary.MergedDictionaries>

这个方法没有问题,所有资源都能被VS IntelliSense识别。

现在为了更容易使用自定义控件,我使用以下 class:

public class Theme : ResourceDictionary
    {
        public Theme()
        {
            if (DesignerHelper.IsInDesignMode)
            {
                MergedDictionaries.Add(new ResourceDictionary
                {
                    Source = new Uri("pack://application:,,,/customControl;component/ThemeResources/Light.xaml")
                });
                MergedDictionaries.Add(new ResourceDictionary
                {
                    Source = new Uri("pack://application:,,,/customControl;component/ThemeResources.xaml")
                });
            }
            else
            {
                UpdateResource();
            }
        }

        private Uri _source;

        public new Uri Source
        {
            get => DesignerHelper.IsInDesignMode ? null : _source;
            set => _source = value;
        }

        
        public string Name { get; set; }

        private void UpdateResource()
        {
            if (DesignerHelper.IsInDesignMode) return;
                MergedDictionaries.Clear();
                MergedDictionaries.Add(new ResourceDictionary
                {
                    Source = new Uri("pack://application:,,,/customControl;component/ThemeResources.xaml")
                });
                MergedDictionaries.Add(new ResourceDictionary
                {
                    Source = new Uri("pack://application:,,,/customControl.Controls;component/ThemeResources/Light.xaml")
                });
        }

        
    }

现在这样我们就可以使用自定义控件了:

<ResourceDictionary.MergedDictionaries>
  <ui:Theme/>
</ResourceDictionary.MergedDictionaries>

现在的问题是 None 的资源没有被 IntelliSense 检测到 但是如果我们自己写样式名称,我们可以使用资源。

为什么会出现这个问题? 如何解决这个问题?

当未构建解决方案时,

XAML 智能感知需要在没有 运行 任何代码的情况下工作 and/or。因此它不知道创建 Theme 会用 pack://application:,/customControl;component/Themes/Generic.xaml.

填充它