2017-07-03 2 views
0

Ich arbeite an einer WPF-Anwendung, wo ich eine Liste von Symbolen anzeigen möchte, die ich als PNG-Bilder in den Ressourcen-Ordner meines Projekts eingebettet habe.
die Bilder Build Aktion ‚Ressource‘, und sie befinden sich wie folgt dar:windows wpf iterativ laden Ressourcendateien

'NameOfProject'/Resources/Icons/'SomeCategories'/'AllTheIcons'.png 

Da es etwa tausend sind, würde Ich mag sie in der Listenansicht wie so über eine foreach-Anweisung laden:

foreach (imageorwhatever icon in Resources/Icons/Category1) { ... } 
foreach (imageorwhatever icon in Resources/Icons/Category2) { ... } 
etc. 

Ich habe bisher noch keinen Weg gefunden, wie ich das erreichen kann. Alle Lösungen, die ich gefunden habe, zielen auf jede Ressource einzeln oder laden sie aus der Datei.

Ich würde es vorziehen, die Bilder iterativ geladen, weil ich nicht wirklich 1000 Bilder in Code definieren möchten oder XAML

Antwort

0

Um sie in WPF verwenden sie Teil eines Resource sein müssen, so dass sie zugänglich sind. Hier ist ein Code, der für mich funktioniert:

using System; 
using System.IO; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media.Imaging; 

namespace ResourceTest 
{ 
    public partial class MainWindow 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      var dict = new ResourceDictionary(); 

      var baseDir = AppDomain.CurrentDomain.BaseDirectory; 

      foreach (var file in Directory.GetFiles("Images")) 
      { 
       dict.Add(file, new BitmapImage(new Uri(Path.Combine(baseDir, file)))); 
      } 

      Application.Current.Resources.MergedDictionaries.Add(dict); 

      foreach (var file in Directory.GetFiles("Images")) 
      { 
       var img = new Image(); 
       img.Source = (BitmapImage) FindResource(file); 

       ListBox.Items.Add(img); 
      } 
     } 
    } 
} 

Alles, was Sie brauchen, ist die List-Box in XAML dem Namen „ListBox“ dies auszuführen:

<ListBox x:Name="ListBox" HorizontalAlignment="Left" Height="238" Margin="23,30,0,0" VerticalAlignment="Top" Width="130"/> 

Ich habe nicht lange verbringen auf diese und stattdessen von dieser zweiten Schleife wäre es besser, nur die Elemente in eine Liste zu legen, dann dem ResourceDictionary und dann der ListBox zuzuweisen, aber das funktioniert.

EDIT: Vergessen Sie aber den Namen der Ressource Ich mache nur den Dateinamen, wie Sie im obigen Beispiel sehen können. Möchte das ändern oder zumindest die Erweiterung entfernen.