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

问题描述 投票:12回答:2

我有两个图书馆和一个应用程序组件,项目布局,我想知道我怎么能在这在其他的定义我的图书馆之一引用样式由他们的关键。

我的解决方案布局:

  • WpfControls.dll - 保存通用的可重复使用的控件,例如基于WPF NumericUpDown控件以及其他基本的控件和一些风格,以及我想提出重用。对于这个例子的目的可以说,在这里我的风格键定义为MyButtonStyle。
  • SpecializedControls.dll - 保存专门给我们的应用程序,如在WPF定制的复合控件和用户控件控制。这是我想引用WpfControls.dll集中定义的MyButtonStyle风格。
  • Application.exe - 该组件使用在SpecializedControls.dll组件定义的控制。

我见过一些例子,说明如何用简单的单一控制库和应用程序组件做到这一点,但我的情况下,我有两个组件和应用。所以在我的情况下,换句话说,我没有一个App.xaml中在我的第二控制图书馆,在那里我可以使用MergeDictionaries概念。我敢肯定,如果我想,我可以直接把MergedDictionaries参考每个控件XAML文件合并所有在WpfControls.dll组件定义Generic.xaml的,但我的猜测是,这会导致风格进行冗余合并到不同的地方在我SpecializedControls组件,它似乎并不像最好的解决办法。更糟糕的是,这些字典也可以合并成Application.exe为好,这是否开始在运行时臃肿我的应用程序?

任何人都可以澄清什么建议或与programtic和资源开销最少的分享这种风格最好的办法。

更新:经过多一点的测试看来,我无法参照由它甚至在同一个组件内的关键定义Generic.xaml任何资源。可能有一些完全错了,我如何如何理解资源键工作,所以我必须多一点研究,以及寻找到ComponentResourceKey。如果有人有任何提示或建议,请帮助。

wpf assemblies styles resourcedictionary mergeddictionaries
2个回答
14
投票

在WPF资源查找工作中的一个层次:最高逻辑树,然后应用程序资源,主题资源和最后的系统资源。

主题资源通常可以只是隐含(甚至在组件内它们被定义)进行访问。这仅仅是样式,其中的TargetType可以作为隐含的关键意义。

为了完成你想要做什么,有两种选择:

  • 使用ComponentResourceKey。这是一种特殊的资源键允许引用资源来自其他组件。例如,你可以定义WpfControls主题字典刷: <LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}"> <GradientStop Color="Red" /> <GradientStop Color="Blue" Offset="1" /> </LinearGradientBrush> 然后你就可以在SpecializedControls引用它: <UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" />
  • 使用MergedDictionaries导入词典到应用程序资源。您可以在应用程序装配做到这一点,当应用程序加载,即使控制了在SpecializedControls将能够使用这些资源。你将不得不在这种情况下,你可以通过把一个假的App.xaml在SpecializedControls解决了设计时体验的问题,这也将包含对字典的引用。

希望这可以帮助,

Aelij。


0
投票

接受的答案是正确的,我只是解释如何使用MergedDictionaries

在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>
© www.soinside.com 2019 - 2024. All rights reserved.