来自外部库和静态资源的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样式

现在我不确定您的项目结构到底是什么样子,但以下内容适用于我:

创建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.

中链接它。