使用一个类库(和主题)作为另一个类库的基础

时间:2011-11-15 19:31:53

标签: wpf themes libraries

仍然在WPF,主题,派生等方面学习这些东西

我理解“Themes \ Generic.xaml”的基础知识,然后设置应用程序的app.xaml文件,以包含指向相关主题的资源字典。

所以,从应用程序项目的角度来看,这很好。现在,从类库/ dll文件怎么样。我有一个DLL项目,我想用它作为我项目中所有控件的基础。在那里,我有Themes / Generic.xaml,并编写了一些基础知识来确认视觉设计实现(最初确认没问题,在App / exe项目下进行测试)。

现在,我想在实际应用之前将这个主题放在一个水平上。同样,这是基线。现在,我添加了第二个自定义分组控件库(例如,用户控件用于地址信息...多个地址行,城市,州,邮政编码,标签等)。我希望第二个库能够引用带有主题的第一个库,因此我可以在设计时看到它的外观(对齐,颜色,字体等)。

我应该在什么/哪里让一个DLL知道作为第一个DLL基础的合并字典。希望这是有道理的。

- 编辑 - 澄清

头等舱......“MyThemeLibrary”编译成.dll 在这个dll中是“/Themes/MyTheme.xaml”的路径/文件

正如第一个答案所建议的那样,如果我在第一个库中有一个资源字典,我可以在其他任何我将从中派生出来的地方引用它。所以,我有

<ResourceDictionary x:Name="MyGenericTheme"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/Themes/MyTheme.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

第二类库......“SecondLevel”编译成.dll 在这里,我有一个用户控件,我想将列/行,标签和文本框控件放入网格。我希望控件能够尊重第一个dll的“MyTheme.xaml”中定义的颜色,字体,大小和对齐。

<UserControl x:Class="SecondLevel.multipleControlContainer"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >

   <Grid>
      <Grid.ColumnDefinitions>
         <ColumnDefinition />
         <ColumnDefinition />
      </Grid.ColumnDefinitions>
      <Grid.RowDefinitions>
         <RowDefinition />
      </Grid.RowDefinitions>

      <Label Content="Something" 
         Grid.Row="0" Grid.Column="0" />

      <TextBox Text="Testing" Grid.Row="1" Grid.Column="1" />
   </Grid>
</UserControl>

那么,我应该如何/我应该做什么/声明,将资源字典从第一个库包含到第二个库中。

1 个答案:

答案 0 :(得分:1)

引用您的dll,如果您知道主题的位置,则可以执行此操作

<Application x:Class="My.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Application.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <!-- Common base theme -->
        <ResourceDictionary Source="pack://application:,,,/Your.Base.Dll;component/YourResDictionary/YourTheme.xaml" />

        <!-- here comes your custom theme -->

      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
  </Application.Resources>
</Application>

在App.xaml中执行此操作

澄清之后

编辑(查看评论)

<UserControl x:Class="SecondLevel.multipleControlContainer"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <UserControl.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <!-- Common base theme -->
        <ResourceDictionary Source="pack://application:,,,/Your.Base.Dll;component/YourResDictionaryFolder/MyGenericTheme.xaml" />
        <!-- Custom theme -->
        <ResourceDictionary Source="pack://application:,,,/Another.Dll;component/AnotherResDictionaryFolder/MyCustomTheme.xaml" />
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
  </UserControl.Resources>

  <Grid>
    <!-- all controls in this usercontrol respect the styles in MyGenericTheme.xaml"
         if you use implicite styles-->
    <Grid.ColumnDefinitions>
      <ColumnDefinition />
      <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
      <RowDefinition />
    </Grid.RowDefinitions>
    <Label Content="Something"
           Grid.Row="0"
           Grid.Column="0" />
    <TextBox Text="Testing"
             Grid.Row="1"
             Grid.Column="1" />

    <!-- if you use explicit styles then you must do this -->

    <TextBox Style="{StaticResource myTextBoxStyle}"
             Text="Testing"
             Grid.Row="1"
             Grid.Column="1" />
  </Grid>
</UserControl>