wpf c#-4.0 user-controls expression-blend-4

wpf - Cómo resolver recursos estáticos de tiempo de diseño en UserControls incrustados en Blend 4



c#-4.0 user-controls (3)

La versión corta ¿Cómo se manejan las búsquedas de recursos estáticos en UserControls que se incrustan en otros controles de Windows / usuario / personalizados? Para que Blend 4 lo represente correctamente @ design time, algo que Visual Studio ya hace por usted.

La versión larga Como sugiere la pregunta, tenemos una ventana que tiene algunos controles de usuario incrustados y la ventana, cada uno como control de usuario incrustado, todos usan extensiones de marcado de recursos estáticos para resolver referencias a recursos encontrados en un diccionario fusionado en el archivo app.xaml .

Blend no tiene problemas para cargar y representar cualquiera de los controles de usuario de muestra que hice en VS Designer Surface cuando se abren individualmente. No tiene problemas para resolver las innumerables extensiones de marcas de recursos estáticos que empleo en casi todos lados.

Cada vez que trato de abrir mi ''MainWindow.xml'', (un control de ventana) noté que estaba obteniendo 4 - No puedo crear errores de tipo de instancia con Blend 4 diciéndome amablemente en el ArtBoard que ha detectado algunas excepciones de tiempo de diseño. Profundizando en estas excepciones adjuntando la instancia del depurador VS a Blend, noté que cada recurso estático al que hacía referencia, se quejaba de que no podía encontrarlo.

Como una comparación, miré un control personalizado que creé, no empleó ningún recurso estático en absoluto, sino que fueron recursos locales. Este control personalizado cuando estaba incrustado en un UserControl que noté funcionó bastante bien. ¡Creo que es obvio por qué!

¿Alguien en SO, tiene alguna idea de cómo solucionar este problema? Probé todo el ''Agregar un diccionario de tiempo de diseño'' <- que funciona parcialmente, ¡los controles de usuario incrustados aún no se crean en absoluto!

Investigación

  1. Error de vista de diseñador de MVVM Light + Blend: no se puede encontrar el recurso llamado ''Locator''
  2. Temas usando recursos sin mezclar vomitando

ACTUALIZACIÓN: Posibles soluciones:

  1. Emplee un enfoque similar presentado aquí: GianlucaCucco Respuesta
  2. Convierta todas las búsquedas de recursos estáticos en recursos locales para UserControls?
  3. En su lugar, convierta todas las búsquedas de recursos estáticos en recursos dinámicos.

Ninguna de estas soluciones es bonita. = (


Por extraño que pueda parecer (y no puedo encontrar una razón lógica por la cual), el mensaje de error mostró el recurso que no pudo encontrar como "maindictionary.xaml", mientras que el archivo y todas las referencias fueron "MainDictionary.xaml".

Abrí las propiedades del recurso en el Explorador de soluciones, cambié el Nombre de archivo a manidictionary.xaml, luego volví a MainDictionary.xaml y los cinco mensajes de error que recibía ... desaparecieron.

Espero que esta respuesta llegue a manos de otra persona que pueda estar luchando con el problema esotérico y que ayude.


Pruebe esta respuesta : parece un problema similar. No he tenido ocasión de usarlo todavía, así que tengo curiosidad por saber si funciona o no para usted. Sin duda es menos desordenado que las otras soluciones.


Tengo varios recursos en un archivo Converters.xaml del que Blend solía quejarse. Mi solución es cargar a la fuerza ese archivo xaml en el momento del diseño.

using System; using System.ComponentModel; using System.IO; using System.Windows; using System.Windows.Markup; public static class DesignTimeSupport { public static void LoadCommonConvertersForBlend(this ResourceDictionary resourceDictionary) { if (resourceDictionary == null || !DesignerProperties.IsInDesignTool) return; var convertersXamlUri = new Uri("Assets/Converters.xaml", UriKind.Relative); var streamInfo = Application.GetResourceStream(convertersXamlUri); using (var reader = new StreamReader(streamInfo.Stream)) { var converters = (ResourceDictionary)XamlReader.Load(reader.ReadToEnd()); resourceDictionary.MergedDictionaries.Add(converters); } } }

La ViewBase llama a este método en el constructor.

public class ViewBase : Page { public ViewBase() { Resources.LoadCommonConvertersForBlend(); } }

Las clases que no heredan de ViewBase hacen su propia llamada.