首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wpf通过ResourceDictionary访问第三方主题和Skins

wpf通过ResourceDictionary访问第三方主题和Skins
EN

Stack Overflow用户
提问于 2021-12-16 12:03:30
回答 1查看 166关注 0票数 2

我正在创建一个WPF Revit Addin。为此,我想使用一些第三方控件来实现额外的UI功能和它们的样式(请参阅ModernWpf)

在“正常”的WPF应用程序中,这一切都很好:我添加了库(nuget),并将主题资源添加到app.xamlResourceDictionary.MergedDictionaries中。

代码语言:javascript
复制
<Application.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ui:ThemeResources />
      <ui:XamlControlsResources />
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Application.Resources>

向页面添加(例如) DropDownButton控件并运行WPF应用程序将产生一个工作的和样式化的DropDownButton。

带样式的DropDownButton

在我的Revit Addin中,这在某种程度上行不通。由于没有app.xaml,我尝试在不同的地方添加资源(窗口、页面、UserControl、主题资源MainTheme.xaml、.控件本身显示,下拉操作工作,但没有样式。

没有造型的DropDownButton

ModernWpf.dllModernWpf.Controls.dll被复制到Revit文件夹中,这些dll保存了资源(如DotPeek所示),因此这些资源应该是可用的。

DotPeek on ModernWpf.dll

我漏掉了什么/我怎样才能解决这个问题?

谢谢你,米歇尔

EN

回答 1

Stack Overflow用户

发布于 2022-02-01 07:44:19

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

使用资源字典创建xaml文件,例如"Resources.xaml“(为了方便地在类库中创建WPF,请查看此问题)

在"Resources.xaml“中创建全局资源

创建这个类。将项目名称*替换为项目名称。

代码语言:javascript
复制
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。如下所示:

代码语言:javascript
复制
<Window.Resources>
        <revitPluginUi:SingletonResources>
        </revitPluginUi:SingletonResources>
</Window.Resources>

现在,您可以从"Resource.xaml“窗口访问所有资源。

资源键的IDE自动完成将无法工作。

重要的注意事项:如果需要为控制创建本地资源,并且定义了SingletonResources,则需要在SingletonResources标记中定义本地资源。如下所示:

代码语言:javascript
复制
<Window.Resources>
        <revitPluginUi:SingletonResources>
            <SolidColorBrush x:Key="MyLocalBrush"/>
        </revitPluginUi:SingletonResources>
</Window.Resources>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70378718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档