2010-09-16 6 views
10

Considere un archivo | Nuevo proyecto de una aplicación de WPF que contiene:¿Por qué son necesarios los uri absolutos para los diccionarios fusionados en Generic.xaml?

  1. Un nuevo control personalizado denominado CustomControl1
  2. Dos nuevos diccionarios de recursos nombrados Dictionary1 y Dictionary2

Tome el estilo generada fuera del Generic.xaml y moverlo a Dictionary2. Luego fusionar Dictionary2 en Dictionary1 y Dictionary1 en genérico como esto:

<!--Generic.xaml--> 
<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="pack://application:,,,/Themes/Dictionary1.xaml"/> 
</ResourceDictionary.MergedDictionaries> 

<!--Dictionary1.xaml--> 
<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="Dictionary2.xaml"/> 
</ResourceDictionary.MergedDictionaries> 

a continuación, añadir una instancia de CustomControl1 en la parrilla de MainWindow. (Esta parte es necesaria para reproducir el problema. El proyecto siempre compila bien, solo en tiempo de ejecución aparece el problema y se debe hacer referencia a los diccionarios)

En Dictionary1.xaml me estoy fusionando en otra dicción del mismo carpeta, por lo que funciona una simple Fuente = "Diccionario2.xaml". Sin embargo, en Generic.xaml debo usar un URI absoluto. Si cambio lo anterior para que sea Source = "Dictionary1.xaml" sin el paquete: // cosas de la aplicación, entonces obtengo una XamlParseException causada por una IOException "No se puede localizar el recurso 'dictionary1.xaml'" cuando intenta construir MainWindow.

Mi pregunta:¿Qué tiene especial sobre generic.xaml con respecto a la resolución relativa de URI, y por qué?

Respuesta

0

Solo una conjetura: generic.xaml debe ser accesible desde ensamblados externos también, por lo que es una forma de garantizar que los recursos se puedan encontrar desde cualquier lugar, usando URIs absolutos. Como dije, es solo una puñalada en la oscuridad, no estoy seguro.

10

Disculpe porque no tengo la capacidad de escribir comentarios, así que publico esto como una respuesta.

Tengo la misma situación y todo funciona bien para mí. No necesito poner "paquete: // aplicación" en la ruta en Generic.xaml. Pero solo cuando el tipo de salida de un ensamblaje es "Aplicación de Windows". Para "Biblioteca de clases" Necesito agregar el nombre del ensamblado a la ruta (Source="/ClassLibarayAssemblyName;component/Themes/Dictionary1.xaml") porque el motor WPF intenta buscar Dictionary1.xaml en el ensamblaje principal de la aplicación.

Marco de destino en ambos casos es ".NET Framework 4 Client Profile"

Cuestiones relacionadas