来自外部库和静态资源的WPF样式
本文关键字:资源 WPF 样式 静态 外部 | 更新日期: 2023-09-27 18:10:48
我正在一个库中编写几个c#控件,这些控件将在整个应用程序中被访问。我的结构是这样的:
解决方案应用1
应用2
应用3
-控制库(包含WPF控件)
一切都工作得很好——但问题是,我的代码中也有一些资源试图从控制库访问。
控件库有一个样式加载器,它将执行以下操作(并且在加载每个应用程序之前执行):
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)
});
}
每个应用程序在它的根窗口上调用这个stylesloader . includevisualstyles (x)。
现在,如果我的窗口/视图使用这个库中的一个项目,即MyAppColor,它找不到它,如果我使用以下行(在App1中):
& lt; TextBlock>
& lt; TextBlock.Foreground>
& lt;/TextBlock.Foreground>
& lt;/TextBlock>
它将抛出一个XamlParseException,声称它找不到MyAppColor。如果我在App1(不是Window)中手动链接UserControl顶部的Resource,使用相当于样式加载器的XAML。IncludeVisualStyles(在UserControl.Resources中创建一个合并字典),它工作得很好。但是我不想手工完成,而是想用代码链接这些资源。
我正在考虑创建一个静态样式库,只使用x: static library。MyAppColor,但这似乎是一个解决方案,可能会混淆其他WPF开发人员。
关于如何解决这个问题或什么可能发生的想法?对于资源和样式如何工作的任何进一步的考虑都将非常感激。
编辑:我也可以添加,如果我使StaticResource的动态资源,他们有时工作。例如,如果我有ControlA和ControlB, ControlA不会正确接收样式/颜色,而ControlB会——这是WPF的基础控件,如Border, TextBlock, CheckBox等。
编辑2:应用程序不是"真正的"应用程序——它们包含一个创建Windows的逻辑引导程序。它们作为VSTO的插件存在,而VSTO没有应用程序的概念。我的想法是将资源链接到窗口,并希望在搜索资源时,它会搜索到合并的字典树,但没有这样的运气。
现在我不确定您的项目结构到底是什么样子,但以下内容适用于我:
创建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}">
对于Styles,其工作原理相同。
如果您想稍后添加您的资源,您需要使用DynamicResource
代替。我猜您调用IncludeVisualStyles
方法太晚了。"在加载每个应用之前"到底是什么意思?如果你在Application_Startup中做,就像我做的那样,窗口还没有创建,除非你手动创建它。
当然,正如HighCore所说,除非你真的有很好的理由不这样做,否则就在App.xaml的Application.Resources.