2012-07-03 22 views
9

Para optimizar mi aplicación, creo un SharedResourceDictionary. Con esto, guardo unos 250 mb de memoria en tiempo de ejecución, por lo que funciona bien.SharedResourceDictionary: edite el recurso en Blend

Mi problema está en el tiempo de diseño, en Blend 4, no tengo más acceso a mi recurso. Para modificar una plantilla (bruja está en mi archivo de recursos), por lo general clic derecho sobre mi control y elijo Editar plantilla -> Editar actual, como en esta imagen:

enter image description here

tengo que modificar mi la plantilla de esa manera, es 100 veces más rápido que ir en mi archivo de recursos y encontrar el bueno ... tengo un montón de recursos ...

mi SharedResourceDictionary se implementa de la siguiente (que se encuentra en la web):

public class SharedResourceDictionary : ResourceDictionary 
{ 
    /// <summary> 
    /// Internal cache of loaded dictionaries 
    /// </summary> 
    public static Dictionary<Uri, ResourceDictionary> _sharedDictionaries = 
     new Dictionary<Uri, ResourceDictionary>(); 

    /// <summary> 
    /// Local member of the source uri 
    /// </summary> 
    private Uri _sourceUri; 

    /// <summary> 
    /// Gets or sets the uniform resource identifier (URI) to load resources from. 
    /// </summary> 
    public new Uri Source 
    { 
     get 
     { 
      if (IsInDesignMode) 
       return base.Source; 

      return _sourceUri; 
     } 
     set 
     { 
      _sourceUri = value; 

      if (!_sharedDictionaries.ContainsKey(value)) 
      { 
       // If the dictionary is not yet loaded, load it by setting 
       // the source of the base class 
       base.Source = value; 

       // add it to the cache 
       _sharedDictionaries.Add(value, this); 
      } 
      else 
      { 
       // If the dictionary is already loaded, get it from the cache 
       MergedDictionaries.Add(_sharedDictionaries[value]); 
      } 
     } 
    } 

    /// <summary> 
    /// Check if we are in Blend to prevent error 
    /// </summary> 
    public bool IsInDesignMode 
    { 
     get 
     { 
      return 
      (bool) 
      DependencyPropertyDescriptor.FromProperty(DesignerProperties.IsInDesignModeProperty, 
      typeof(DependencyObject)).Metadata.DefaultValue; 
     } 
    } 
} 

Alguien tiene una idea si t aquí hay una solución para esto? Realmente quiero mantener este diccionario compartido debido a la mejora de la memoria, pero también quiero modificar mi recurso fácilmente ...

Cualquier pista será apreciada. Gracias.

EDIT:

Hacer esto (SharedResourceDictionary), también tengo un problema con recurso estático:

Provide value on 'System.Windows.Markup.StaticResourceHolder' threw an exception. 

Y cuando las cambio de dinámica de recursos funciona, o si cambio de la SharedResourceDictionary por un ResourceDictionary simple también funciona. El proyecto puede compilar pero no puedo editar el recurso sin una modificación, como dije.

+0

creo que sería bueno también para hacer referencia a la fuente de su código de ejemplo: http: //www.wpftutorial.net/MergedDictionaryPerformance.html, también la misma sección de comentario fuente explica cómo hacer uso de diccionarios de recursos compartidos en tiempo de diseño. Gracias. – Ahmad

+0

Una posible manera de evitar esto es reemplazar el SharedResourceDictionary con un simple ResourceDictionary cuando se encuentra en modo de depuración, es decir .: #if DEBUG clase pública SharedResourceDictionary: ResourceDictionary {} #else ... Cesario

Respuesta

1

¿está recopilando para .NET 4?

usted podría estar golpeando el error en el que se produce un error para escanear sus ResourceDictionaries correctamente.

Se dice que debe agregar sus ResourceDictionaries al nivel de nivel App.xaml (en Application.Resources) y agregar un estilo predeterminado ficticio.

Esto puede no funcionar para usted ya que parece estar agregando sus recursos bajo su control.

http://blogs.windowsclient.net/rob_relyea/archive/2010/04/26/my-staticresource-reference-worked-differently-with-wpf-4-rc-than-it-does-with-wpf-4-rtm.aspx

Adding a Merged Dictionary to a Merged Dictionary

Trouble referencing a Resource Dictionary that contains a Merged Dictionary

http://connect.microsoft.com/VisualStudio/feedback/details/553528/defaultstylekey-style-not-found-in-inner-mergeddictionaries

+0

Esto no parece resolver el problema. Sigo experimentando el problema usando [esta implementación SharedResourceDictionary] (http://stackoverflow.com/a/10722527/1781068). – Gregor

0

En realidad, es problemático utilizar esta función. = (

Tal vez en el futuro las cosas van a mejorar, no sé si va a ayudar, pero se puede intentar una implementación diferente: WPF SharedResourceDictionary (pero no garantiza que funcionará)

me di por vencido usando la SharedResourceDictionary debido a problemas en tiempo de diseño, sólo cuando el proyecto se ha completado el 100% vuelvo a utilizar.

Cuestiones relacionadas