MergedDictionaries y búsqueda de recursos

Tengo un problema con los diccionarios de recursos y los diccionarios combinados en general, especialmente cuando se trata del rendimiento de la búsqueda de recursos. Después de algunas pruebas de rendimiento, descubrí que ResourceDictionary.get_MergedDictionaries es la llamada con más aciertos (marcada en ANTS profiler). Tenemos alrededor de ~ 300 xamls de diccionario de recursos, y muchos de ellos están utilizando el diccionario combinado para "incluir" otros estilos. Bueno, los diccionarios get_Merged cuentan con una parte de nuestra aplicación, donde no está sucediendo mucho, fue de alrededor de 10 millones de visitas. Entonces, supongo que estamos haciendo algo completamente incorrecto con los diccionarios de recursos en general. Así que traté de refactorizar todo y quiero tratar de deshacerme de todos los diccionarios combinados.

Ahora a la pregunta real. Traté de deshacerme de los diccionarios fusionados pero fallé. Tengo entendido que cuando usa StaticResource, la búsqueda necesita que el recurso se defina antes que el actual. Hice el siguiente breve ejemplo:

Un proyecto principal y una biblioteca de control personalizada.

la biblioteca de control personalizado contiene 2 xamls.

<!-- 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>

Ahora en el proyecto principal, MainWindow.xaml se ve así

<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>

Ese es el objetivo deseado. pero desafortunadamente esto falla porque no se puede encontrar el recurso "myColor". Por supuesto, sé cómo solucionarlo, agregar un diccionario combinado en Templates.xaml y hacer referencia a Colors.xaml, pero siempre pensé, bueno, nunca lo verifiqué, que los recursos se buscan dependiendo del árbol lógico y los recursos del elemento. Mi entendimiento es; Se crea el botón; intente buscar la plantilla ... encontrada; intente buscar el color, que no se encuentra en los recursos propios, camine y use los recursos de Windows.

Parece que estoy equivocado. Así que espero que alguien pueda arrojar algo de luz sobre esto por mí. Hacemos un uso intensivo de WPF y, a pesar de esto, logramos mucho con él, pero debido a un comportamiento erróneo al principio, nuestro rendimiento es bastante malo solo por la búsqueda de recursos. Cualquier ayuda sería muy apreciada

Gracias de antemano Saludos cordiales Nico

Respuestas a la pregunta(4)

Su respuesta a la pregunta