外部库和静态资源的WPF样式

时间:2014-06-30 22:57:40

标签: c# wpf wpf-controls

我在一个库中编写了几个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,并希望在搜索资源时,它会搜索树到那个合并的字典,但没有这样的运气。

1 个答案:

答案 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。