2009-05-13 11 views
6

Cambié la acción de compilación de mi App.xaml a "Página" para poder manejar una pantalla emergente y asegurarme de que mi aplicación se ejecutara como una sola instancia solo (teniendo mi propio punto de entrada). Funciona bien en tiempo de ejecución, pero en tiempo de diseño la aplicación ya no puede ver mis recursos. Los recursos están en archivos xaml separados ubicados en el mismo proyecto. ¿Cómo puedo hacer que mi aplicación vea los recursos en tiempo de diseño nuevamente?WPF: acceso a los recursos en tiempo de diseño cuando App.xaml's Build Action = Página

Gracias

+0

Puedo cambiar de un lado a otro: cambie la acción de compilación de App.xaml a Page cuando esté listo para publicar y vuelva a cambiarlo cuando esté en desarrollo. Pero, ¿es esto lo que se supone que debo hacer? –

Respuesta

0

Si entiendo a corregir, que está cargando los recursos de toda la aplicación en el App.xaml? En este caso se puede hacer así:


App app = new App(); 
//Get assembly name is your own method 
string assemblyName = GetAssemblyName(Assembly.GetExecutingAssembly()); 

Uri resourceLocater = new Uri("/" + assemblyName + ";component/app.xaml", UriKind.Relative); 
System.Windows.Application.LoadComponent(app, resourceLocater); 
MainWindow mainWindow = new MainWindow(); 
app.Run(mainWindow); 

A continuación, sus recursos serán cargados

/Daniel

+6

La pregunta original dice que el problema solo ocurre en el momento del diseño. Me parece que el código anterior no tendrá ningún efecto en el tiempo de diseño. ¿Qué me estoy perdiendo? (Tengo el mismo problema: funciona bien en tiempo de ejecución, pero recibo 'Referencia de StaticResource ... error no encontrado' en el momento del diseño) – CyberMonk

+1

No servirá de nada. Vea la respuesta que acabo de agregar. Gustavo, ¿por qué marcó esto como correcto? –

3

Asegúrese de que está llamando InitializeComponent() como la primera línea del constructor de su aplicación:

public App() 
{ 
    // This is the method generated by VisualStudio that initializes 
    // the application from associated XAML file 
    InitializeComponent(); 

    // Do everything else 
} 
+1

OMG, me refiero a OMFG. He estado luchando con el diseñador al no encontrar mis recursos estáticos en un proyecto de control separado, donde el proyecto principal tiene la aplicación.xaml que carga y combina los diccionarios. Crear un App.xaml en el proyecto de controles y luego quitarlo para tener solo los diccionarios de recursos y la llamada a InitializeComponent() hizo algo totalmente inesperado: ¡funcionó! los controles dentro de los controles ahora se están renderizando en lugar de quejarse de los recursos que faltan, los errores intellisense en la vista xaml también se han ido, ¡oh feliz día! – Erikest

6

Factoriza tus recursos en un diccionario de recursos independiente y luego júntalos a App.xaml de esta manera:

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="MasterResources.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Puede agregar varios diccionarios de recursos de esta manera según sea necesario.

también hay que hacer lo mismo en UserControls (y Windows que UserControls de referencia utilizando los recursos):

<UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="MasterResources.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</UserControl.Resources> 

Ver http://ithoughthecamewithyou.com/post/Merging-Resource-Dictionaries-for-fun-and-profit.aspx para más información sobre este tema.

+6

Cuando he utilizado este enfoque, he terminado con copias separadas de los recursos definidos en MasterResources.xaml para cada UserControl que los fusiona, lo que conduce a la memoria horrible. –

+2

Exactamente. Los recursos y estilos compartidos o gráficos entre los componentes de la interfaz de usuario son un aspecto clave de la codificación de una interfaz de usuario de WPF; sin embargo, no parece haber ningún soporte en modo de diseño, y la recomendación de MS de copiar los recursos en cualquier lugar que use ellos son simples tonterías. – Neutrino

+0

Esta debería ser la respuesta aceptada. El enlace en particular describe exactamente el mismo escenario que se planteó en la pregunta. También me encontré con el mismo problema y descubrí que, lamentablemente, fusionar diccionarios en cada ventana y el control de usuario parece ser la única solución para que el diseñador no pueda resolver los recursos.Se supone que WPF es esta gran tecnología, pero últimamente siento que me veo obligado a usar un truco tras otro para que funcione. – Eternal21

Cuestiones relacionadas