我在一个库中编写了几个C#控件,可以在整个应用程序中访问它们。我的结构看起来像这样:
解决方案
-App 1
-App 2
-App 3
- 控制库(使用WPF控件)
一切都运行良好 - 但问题是我的代码中还有一些资源正试图从该控件库中访问。
Control Library有一个StyleLoader,它将执行以下操作(并在加载每个App之前执行):
public static void IncludeVisualStyles(Control control)
{
control.Resources.MergedDictionaries.Add(
new ResourceDictionary
{
Source = new Uri("pack://application:,,,/my.app.UI;component/Styles/generic.xaml",
UriKind.RelativeOrAbsolute)
});
}
每个应用程序在其根窗口上调用此StyleLoader.IncludeVisualStyles(x)。
现在,如果我的Window / View使用此库中的项目,即MyAppColor,则无法找到它,如果我使用以下行(在App1中):
< TextBlock的>
< TextBlock.Foreground>
< SolidColorBrush Color =“{StaticResource MyAppColor}”>
< /TextBlock.Foreground>
< / TextBlock的>
它将抛出一个XamlParseException,声称它无法找到MyAppColor。如果我使用StyleLoader.IncludeVisualStyles(在UserControl.Resources中创建合并字典)的XAML等效手动链接App1(而不是Window)中UserControl顶部的Resource,它可以正常工作。但我不想手动执行此操作,而是将资源与代码链接。
我正在考虑创建静态样式库并使用x:Static Library.MyAppColor,但这似乎是一种可能会混淆其他WPF开发人员的解决方法。
有关如何解决此问题或可能发生的事情的任何想法?任何关于资源和风格如何运作的进一步考虑都会受到极大的重视。
编辑:可能我还要补充一点,如果我创建了StaticResource的DynamicResource,那么它们很有用。例如,如果我有ControlA和ControlB,ControlA将无法正确接收样式/颜色,而ControlB将 - 并且这是在WPF的基本控件上,如Border,TextBlock,CheckBox等。编辑2:应用程序不是“真正的”应用程序 - 它们包含一个创建Windows的逻辑引导程序。它们作为VSTO的插件存在,它没有应用程序的概念。我的想法是将资源链接到Window,并希望在搜索资源时,它会搜索树到那个合并的字典,但没有这样的运气。
答案 0 :(得分:1)
现在我不确定你的项目结构究竟是什么样子,但以下内容对我有用:
创建WPF控件库项目,添加资源字典:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="testBrush" Color="Red"></SolidColorBrush>
</ResourceDictionary>
创建一个WPF应用程序,使用以下代码向App.xaml添加一个Startup事件(几乎就是你所做的):
private void Application_Startup(object sender, StartupEventArgs e)
{
Resources.MergedDictionaries.Add(
new ResourceDictionary()
{
Source = new Uri("pack://application:,,,/WpfControlLibrary1;component/Dictionary1.xaml")
});
}
在我的窗口中引用资源:
<Window x:Class="WpfApplication1.MainWindow"
...
Background="{StaticResource testBrush}">
使用样式,它的工作原理相同。
如果您希望稍后添加资源,则需要使用DynamicResource
。我的猜测是你太迟了,而是调用了IncludeVisualStyles
方法。在加载每个应用程序之前它到底意味着什么?如果您在Application_Startup中执行此操作,就像我一样,除非您手动创建Window,否则尚未创建Window。
当然,正如HighCore所说,除非你真的有充分的理由不这样做,只需将它链接到App.xaml的Application.Resources。