MergedDictionaries e pesquisa de recursos

Eu tenho um problema com dicionários de recursos e dicionários de fusão em geral, principalmente quando se trata de desempenho de pesquisa de recursos. Após alguns testes de desempenho, descobri que ResourceDictionary.get_MergedDictionaries é a chamada com mais acessos (marcada no perfil do ANTS). Temos cerca de 300 xamls no dicionário de recursos, e muitos deles estão usando o dicionário mesclado para "incluir" outros estilos. Bem, os get_MergedDictionaries contam com uma parte do nosso aplicativo, onde não está acontecendo muita coisa, foi de cerca de 10 milhões de acessos. Então, acho que estamos fazendo algo completamente errado com os dicionários de recursos em geral. Então, tentei refatorar tudo e quero tentar me livrar de todos os dicionários mesclado

Agora, para a pergunta real. Tentei me livrar dos mergeddictionaries, mas falhei. Meu entendimento é que, quando você usa StaticResource, a pesquisa precisa que o recurso seja definido antes do atual. Fiz o seguinte exemplo curto:

m projeto principal e uma biblioteca de controle personalizad

a biblioteca de controle personalizado contém 2 xaml

<!-- Colors.xaml -->
<ResourceDictionary [stripped namespaces] >
    <SolidColorBrush x:Key="myColor" Color="Green"/>
</ResourceDictionary>

<!-- Templates.xaml -->
<ResourceDictionary [stripped namespaces]>
    <ControlTemplate x:Key="myTemplate" TargetType="Button">
        <Rectangle Fill="{StaticResource myColor}"/>
    </ControlTemplate>
</ResourceDictionary>

Agora, no projeto principal, o MainWindow.xaml se parece com isso

<Window x:Class="ResourceTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/ResourceTestLib;component/Themes/Colors.xaml"/>
                <ResourceDictionary Source="/ResourceTestLib;component/Themes/Template.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Button Template="{StaticResource myTemplate}"/>
    </Grid>
</Window>

Esse é o objetivo desejado. mas, infelizmente, isso falha porque o recurso "myColor" não pode ser encontrado. É claro que sei como corrigi-lo, adicionar um dicionário de fusão no Templates.xaml e referenciar o Colors.xaml, mas eu sempre pensei, bem, eu nunca verifiquei realmente, que os recursos são pesquisados dependendo da árvore lógica e dos recursos do elemento. Meu entendimento é; Botão é criado; tente procurar modelo .. encontrado; tente pesquisar cores, não encontradas em recursos próprios, suba e use os recursos do Windows.

Parece que estou errado. Então, espero que alguém possa esclarecer isso para mim. Fazemos muito uso do WPF e, apesar disso, realizamos muito com ele, mas por causa de algum comportamento errado aprendido no início, nosso desempenho é muito ruim apenas por causa da pesquisa de recursos. Qualquer ajuda seria muito apreciad

Obrigado antecipadamente Atenciosamente Nico

questionAnswers(4)

yourAnswerToTheQuestion