我正在创建一个WPF Revit Addin。为此,我想使用一些第三方控件来实现额外的UI功能和它们的样式(请参阅ModernWpf)
在“正常”的WPF应用程序中,这一切都很好:我添加了库(nuget),并将主题资源添加到app.xaml的ResourceDictionary.MergedDictionaries中。
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ui:ThemeResources />
<ui:XamlControlsResources />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>向页面添加(例如) DropDownButton控件并运行WPF应用程序将产生一个工作的和样式化的DropDownButton。
在我的Revit Addin中,这在某种程度上行不通。由于没有app.xaml,我尝试在不同的地方添加资源(窗口、页面、UserControl、主题资源MainTheme.xaml、.控件本身显示,下拉操作工作,但没有样式。
ModernWpf.dll和ModernWpf.Controls.dll被复制到Revit文件夹中,这些dll保存了资源(如DotPeek所示),因此这些资源应该是可用的。
我漏掉了什么/我怎样才能解决这个问题?
谢谢你,米歇尔
发布于 2022-02-01 07:44:19
正如您所指出的,在Revit中没有app.xaml,因此也没有广泛的程序集资源,这是因为Revit是一个类库,而不是一个正确的WPF应用程序。您可以查看这个问题并采取其中一种方法。在我的附加程序中,我这样解决了这个问题:
使用资源字典创建xaml文件,例如"Resources.xaml“(为了方便地在类库中创建WPF,请查看此问题)
在"Resources.xaml“中创建全局资源
创建这个类。将项目名称*替换为项目名称。
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>https://stackoverflow.com/questions/70378718
复制相似问题