Pergunta

Eu tenho duas bibliotecas e um único layout de projeto de montagem de aplicativo e estou me perguntando como posso fazer referência a estilos por sua chave em uma de minhas bibliotecas definidas na outra.

Layout da minha solução:

  • WpfControls.dll - Contém controles reutilizáveis ​​genéricos, como um controle NumericUpDown baseado em WPF, bem como outros controles básicos e alguns estilos que eu gostaria de tornar reutilizáveis.Para fins de exemplo, digamos que minha chave de estilo aqui seja definida como Meu estilo de botão.
  • SpecializedControls.dll - Contém controles especializados para nosso aplicativo, como controles compostos personalizados e UserControls no WPF.É aqui que eu gostaria de fazer referência ao Meu estilo de botão estilo definido no assembly WpfControls.dll.
  • Aplicativo.exe - Este assembly usa controles definidos no assembly SpecializedControls.dll.

Já vi alguns exemplos explicando como fazer isso com uma biblioteca simples de controle único e assembly de aplicativo, mas no meu caso tenho dois assemblies e um aplicativo.Em outras palavras, no meu caso, não tenho um App.xaml na minha segunda biblioteca de controle onde eu poderia usar o conceito MergeDictionaries.Tenho certeza de que, se quisesse, poderia colocar uma referência MergedDictionaries diretamente em cada arquivo XAML de controle para mesclar todo o Generic.xaml definido na montagem WpfControls.dll, mas meu palpite é que isso resultaria na mesclagem redundante de estilos em vários lugares na minha montagem SpecializedControls que não parece ser a melhor solução.Para piorar a situação, esses dicionários também podem ser mesclados em Application.exe. Isso começa a inchar meu aplicativo em tempo de execução?

Alguém pode esclarecer qual é a abordagem recomendada ou melhor para compartilhar esses estilos com o mínimo de sobrecarga programática e de recursos.

Atualizar:Depois de mais alguns testes, parece que estou tendo problemas para fazer referência a qualquer recurso definido em Generic.xaml por sua chave, mesmo dentro do mesmo assembly.Pode haver algo totalmente errado sobre como estou entendendo como as chaves de recursos funcionam, então terei que pesquisar um pouco mais e também examinar o ComponentResourceKey.Se alguém tiver alguma dica ou sugestão, por favor ajude.

Foi útil?

Solução

A pesquisa de recursos no WPF funciona em uma hierarquia:subindo a árvore lógica, depois os recursos do aplicativo, os recursos do tema e, finalmente, os recursos do sistema.

Os recursos do tema geralmente podem ser acessados ​​apenas implicitamente (mesmo dentro do assembly em que são definidos).Isso é relevante apenas para estilos, onde TargetType pode ser usado como chave implícita.

Para realizar o que você está tentando fazer, existem duas opções:

  • Use um ComponentResourceKey.Esta é uma chave de recurso especial que permite referenciar recursos de outros assemblies.Por exemplo, você pode definir um pincel em Controles Wpf dicionário temático:

    <LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}">
        <GradientStop Color="Red" />
        <GradientStop Color="Blue" Offset="1" />
    </LinearGradientBrush>
    

    E então você pode referenciá-lo em Controles Especializados:

    <UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" />
    
  • Usar Dicionários mesclados para importar um dicionário para os recursos do aplicativo.Você pode fazer isso no Aplicativo assembly e quando o aplicativo é carregado, até mesmo os controles que estão em Controles Especializados seria capaz de usar esses recursos.Você terá um problema com a experiência em tempo de design neste cenário, que pode ser resolvido colocando um App.xaml falso em Controles Especializados, que também conteria uma referência ao dicionário.

Espero que isto ajude,

Aelij.

Outras dicas

A resposta aceita está correta, estou apenas explicando como usar Dicionários mesclados

Em Aplicativo.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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top