Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何引用在另一个库中的单独程序集中定义的WPF样式键_Wpf_Assemblies_Styles_Resourcedictionary_Mergeddictionaries - Fatal编程技术网

如何引用在另一个库中的单独程序集中定义的WPF样式键

如何引用在另一个库中的单独程序集中定义的WPF样式键,wpf,assemblies,styles,resourcedictionary,mergeddictionaries,Wpf,Assemblies,Styles,Resourcedictionary,Mergeddictionaries,我有两个库和一个应用程序程序程序集项目布局,我想知道如何在另一个库中定义的库中通过它们的键引用样式 我的解决方案布局: WpfControls.dll-包含通用的可重用控件,例如基于WPF的NumericUpDown控件,以及其他基本控件和一些我希望可重用的样式。出于示例的考虑,让我们假设这里我的样式键被定义为MyButtonStyle SpecializedControls.dll-保存应用程序专用的控件,如WPF中的自定义复合控件和用户控件。这就是我想引用WpfControls.dll程序

我有两个库和一个应用程序程序程序集项目布局,我想知道如何在另一个库中定义的库中通过它们的键引用样式

我的解决方案布局:

  • WpfControls.dll-包含通用的可重用控件,例如基于WPF的NumericUpDown控件,以及其他基本控件和一些我希望可重用的样式。出于示例的考虑,让我们假设这里我的样式键被定义为MyButtonStyle
  • SpecializedControls.dll-保存应用程序专用的控件,如WPF中的自定义复合控件和用户控件。这就是我想引用WpfControls.dll程序集中定义的MyButtonStyle样式的地方
  • Application.exe-此程序集使用SpecializedControls.dll程序集中定义的控件
我看到一些例子解释了如何使用一个简单的控件库和应用程序集来实现这一点,但在我的例子中,我有两个程序集和一个应用程序。换句话说,在我的例子中,我的第二个控制库中没有App.xaml,在这里我可以使用MergeDictionaries概念。我很确定,如果我想,我可以在每个控件XAML文件中直接放置一个MergeAddictionaries引用,以合并WpfControls.dll程序集中定义的所有Generic.XAML,但我猜这将导致样式冗余地合并到SpecializedControls程序集中的各个位置,这似乎不是最好的解决方案。更糟糕的是,这些字典也可能合并到Application.exe中,这是否会在运行时使我的应用程序膨胀

有谁能澄清一下,以最少的程序和资源开销共享此类样式的推荐方法或最佳方法是什么


更新:经过一点测试后,我似乎很难引用Generic.xaml中通过键定义的任何资源,即使在同一程序集中也是如此。我对资源键工作原理的理解可能存在一些完全错误的地方,因此我将不得不进行更多的研究,同时也要研究组件ResourceKey。如果有任何人有任何提示或建议,请提供帮助。

WPF中的资源查找工作在一个层次结构中:在逻辑树上,然后是应用程序资源、主题资源,最后是系统资源

主题资源通常只能隐式访问(即使在定义它们的程序集中)。这仅与样式相关,其中TargetType可以用作隐式键

要完成您的目标,有两种选择:

  • 使用组件资源键。这是一个特殊的资源密钥,允许引用来自其他程序集的资源。例如,可以在WpfControls主题词典中定义笔刷:

    <LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}">
        <GradientStop Color="Red" />
        <GradientStop Color="Blue" Offset="1" />
    </LinearGradientBrush>
    
    
    
    然后您可以在SpecializedControl中引用它:

    
    
  • 使用合并词典将词典导入应用程序资源。您可以在应用程序集中执行此操作,当应用程序加载时,即使是SpecializedControls中的控件也可以使用这些资源。在此场景中,您将遇到设计时体验问题,您可以通过在SpecializedControl中放置一个假的App.xaml来解决,该控件还将包含对字典的引用

希望这有帮助


Aelij.

公认的答案是正确的,我只是解释如何使用合并词典

在App.xaml

    <Application.Resources>
      <ResourceDictionary>
         <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/-DirectoryName-/FileName.xaml"/>
            <!-- Use Below syntax if your resource file is not inside a directory(in root) -->
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/FileName.xaml"/>
         </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
    </Application.Resources>


我也面临同样的问题。你能扩展第二个选项吗?我不知道它将如何工作,例如,使用MergedDictionary根据另一个程序集中声明的另一个样式声明一个样式。感谢您提供的“fake App.xaml”提示。这使得使用MergedDictionaries技术的效果完全不同。
    <Application.Resources>
      <ResourceDictionary>
         <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/-DirectoryName-/FileName.xaml"/>
            <!-- Use Below syntax if your resource file is not inside a directory(in root) -->
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/FileName.xaml"/>
         </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
    </Application.Resources>