2009-08-12 12 views
1

Ich verwende ein TreeView mit einer ImageList. Wenn das TreeView mit Elementen gefüllt ist, wird jedem Element ein Symbol zugeordnet. Viele dieser Symbole könnten identisch sein, aber derzeit wird kein Code hinzugefügt, um Duplikate zu verfolgen. Ich füge einfach jedes Symbol zur Bildliste hinzu und verfolge dann das Symbol, das jedem Baumknoten zugeordnet ist.Umgang mit Ressourcen für eine große Anzahl von doppelten Symbolen

Meine Frage ist, wie. NET diese Ressourcen behandelt. Stellt die Laufzeit beispielsweise fest, dass einige der Symbole exakt identisch sind und daher nur einmal für alle Duplikate das gleiche Symbol laden? Wenn nicht, könnte ich auf ein Ressourcenproblem stoßen, wenn dies zehntausende Male gemacht wird (das wird nicht typisch sein, aber es könnte passieren)?

Antwort

2

Das Framework verfügt über keinen Mechanismus, mit dem Sie Ressourcen wie diese behandeln können, um sicherzustellen, dass Sie nicht mit doppelt geladenen Dateien landen. Dies gilt insbesondere im Fall einer TreeView, da die ImageList, die sie verwendet, diese Images als Ressourcen lokal für das Formular verwaltet, das die TreeView enthält.

Ein Ansatz, den ich in der Vergangenheit verwendet habe, ist ein Singleton-Objekt zu erstellen, das eine ImageList umschließt. So können Sie steuern, wann/wie ein Bild zur ImageList hinzugefügt wird.

public sealed class ImageListManager 
{ 
    private static volatile ImageListManager instance; 
    private static object syncRoot = new object(); 
    private ImageList imageList; 

    private ImageListManager() 
    { 
     this.imageList = new ImageList(); 
     this.imageList.ColorDepth = ColorDepth.Depth32Bit; 
     this.imageList.TransparentColor = Color.Magenta; 
    } 

    /// <summary> 
    /// Gets the <see cref="System.Windows.Forms.ImageList"/>. 
    /// </summary> 
    public ImageList ImageList 
    { 
     get 
     { 
      return this.imageList; 
     } 
    } 

    /// <summary> 
    /// Adds an image with the specified key to the end of the collection if it 
    /// doesn't already exist. 
    /// </summary> 
    public void AddImage(string imageKey, Image image) 
    { 
     if (!this.imageList.ContainsKey(imageKey)) 
     { 
      this.imageList.Add(imageKey, image); 
     } 
    } 

    /// <summary> 
    /// Gets the current instance of the 
    /// <see cref="ImageListManager"/>. 
    /// </summary> 
    public static ImageListManager Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       lock (syncRoot) 
       { 
        if (instance == null) 
        { 
         instance = new ImageListManager(); 
        } 
       } 
      } 
      return instance; 
     } 
    } 
} 

Sie dann dem TreeView geben einen Hinweis auf diese Abbildungsliste, in den Formen Konstruktor nach dem Aufruf von InitializeComponent() erfolgte im Allgemeinen.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     this.treeView1.ImageList = ImageListManager.Instance.ImageList; 
    } 

    // Making some guesses about how you are adding nodes 
    // and getting the associated image. 
    public void AddNewTreeNode(string text, string imageKey, Image image) 
    { 
     TreeNode node = new TreeNode("display text"); 
     node.Name = "uniqueName"; 

     // This tells the new node to use the image in the TreeView.ImageList 
     // that has imageKey as its key. 
     node.ImageKey = imageKey; 
     node.SelectedImageKey = imageKey; 

     this.treeView1.Nodes.Add(node); 

     // If the image doesn't already exist, this will add it. 
     ImageListManager.Instance.AddImage(imageKey, image); 
    } 

} 
+0

Hallo Scott, ich verstehe entweder deine Antwort nicht oder deine Antwort auf eine andere Frage. Mein Anliegen sind nicht mehrere Instanzen der ImageList, sondern mehrere Kopien desselben Bildes, die mehreren Slots in der ImageList zugewiesen sind. Zum Beispiel könnte das identische Bild den Slots 0, 1, 2, 5 und 100 zugewiesen werden. – Dennis

+0

Es hörte sich so an, als wären Sie besorgt, doppelte Bilder über mehrere TreeViews (oder andere Steuerelemente) mit doppelten Bildern in einem TreeView zu haben. Bildliste. In beiden Fällen bietet das .NET Framework keinen Mechanismus zum Verwalten dieser Ressourcen und zur Vermeidung von Duplizierungen. Im Beispiel in Ihrem Kommentar haben Sie 5 verschiedene Kopien des Bildes, eines an jeder Stelle in der ImageList. Sie müssen die Duplikate selbst nachverfolgen. Wenn Sie feststellen, dass Sie einen Knoten mit einem bereits vorhandenen Bild hinzufügen, verwenden Sie den vorhandenen Bildindex (oder Schlüssel). –

+0

Meine Antwort wurde aktualisiert, hoffentlich wird dies klarer. –

Verwandte Themen