【问题标题】:wpf Access to 3rd party Themes and Skins via ResourceDictionarywpf 通过 ResourceDictionary 访问 3rd 方主题和皮肤
【发布时间】:2022-01-19 12:37:50
【问题描述】:

我正在创建一个 WPF Revit 插件。为此,我想使用一些 3rd 方控件来实现额外的 UI 功能和样式 (see ModernWpf])

在“普通”WPF 应用程序中一切正常:我添加库 (nuget) 并将主题资源添加到 app.xamlResourceDictionary.MergedDictionaries

<Application.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ui:ThemeResources />
      <ui:XamlControlsResources />
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Application.Resources>

向页面添加(例如)DropDownButton 控件并运行 WPF 应用程序会生成一个有效且样式化的 DropDownButton。

DropDownButton with styling

在我的 Revit 插件中,这不起作用。由于没有app.xaml,我尝试在不同的地方添加资源(Window、Page、UserControl、我的主题资源MainTheme.xaml、...控件本身显示并且下拉操作有效,但没有样式.

DropDownButton without styling

ModernWpf.dllModernWpf.Controls.dll 被复制到 Revit Addins 文件夹中,并且这些 dll 保存资源(如 DotPeek 所示),因此它们应该以某种方式可用。

DotPeek on ModernWpf.dll

我错过了什么/我该如何解决这个问题?

提前致谢,米歇尔

【问题讨论】:

    标签: c# wpf revit-api


    【解决方案1】:

    正如您所指出的,在 Revit 插件中没有 app.xaml,因此也没有程序集范围的资源,这是因为 Revit 插件是一个类库,而不是一个合适的 WPF 应用程序。您可以查看此question 并采用其中一种方法。在我的加载项中,我这样解决了这个问题:

    使用资源字典创建 xaml 文件,例如“Resources.xaml”(要在类库中轻松创建 WPF 内容,请查看 question

    在“Resources.xaml”中创建您的全局资源

    创建这个类。将 *name of your project* 替换为您的项目名称。

    public class SingletonResources : ResourceDictionary
        {
            private static ResourceDictionary? inst;
    
            public SingletonResources()
            {
                if (inst is null)
                {
                    var uri = new Uri("/*name of your project*;component/Themes/Resources.xaml", UriKind.Relative);
                    inst = (ResourceDictionary)System.Windows.Application.LoadComponent(uri);
                }
    
                MergedDictionaries.Add(inst);
            }
        }
    

    然后在您希望能够访问“Resources.xaml”的每个控件中,控件内部资源包括 SingletonResources。像这样:

    <Window.Resources>
            <revitPluginUi:SingletonResources>
            </revitPluginUi:SingletonResources>
    </Window.Resources>
    

    现在您可以从窗口内的“Resource.xaml”访问所有资源。

    资源键的 IDE 自动完成功能将不起作用。

    重要注意:如果您需要创建本地资源进行控制,并且您定义了 SingletonResources 您需要在 SingletonResources 标签中定义本地资源。像这样:

    <Window.Resources>
            <revitPluginUi:SingletonResources>
                <SolidColorBrush x:Key="MyLocalBrush"/>
            </revitPluginUi:SingletonResources>
    </Window.Resources>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      相关资源
      最近更新 更多