Hinzufügen von Elementen zu Kombinationsfeld Programmgesteuert
Habe ich die Arbeit mit WPF-alle 2 Tage, kommt aus ASP.NET so mit mir tragen!
Ich bin das füllen einer ComboBox mit xml-Dateinamen aus einem Verzeichnis hinzufügen und ein Symbol für jedes Element. Ich habe alles funktioniert Prima, aber ich Frage mich, ob es eine "bessere", weitere "effiziente" Möglichkeit dies zu tun. Wie ich bereits sagte, bin ich gerade erste Schritte mit WPF und ich will gehen über Dinge, die "richtige" Art und Weise. Mein Arbeits-code ist unten, kann oder soll ich gehen zu diesem einen anderen Weg? Vielen Dank im Voraus für jegliche Hinweise!
<ComboBox Height="24" HorizontalAlignment="Left" Margin="153,138,0,0" Name="cmbFiles" VerticalAlignment="Top" Width="200" //>
private void FillSrFileCombo()
{
string[] dirFiles = Directory.GetFiles(@"D:\TestFiles", "*.xml");
foreach (string datei in dirFiles)
{
string fileName = System.IO.Path.GetFileName(datei);
System.Windows.Controls.StackPanel stkPanel = new StackPanel();
stkPanel.Orientation = Orientation.Horizontal;
cmbFiles.Items.Add(stkPanel);
System.Windows.Controls.Image cboIcon = new Image();
BitmapImage bitMap = new BitmapImage();
bitMap.BeginInit();
bitMap.UriSource = new Uri(@"tag.jpg", UriKind.Relative);
bitMap.EndInit();
cboIcon.Source = bitMap;
cboIcon.Height = 15;
stkPanel.Children.Add(cboIcon);
System.Windows.Controls.TextBlock cboText = new TextBlock();
cboText.Text = " - " + fileName;
stkPanel.Children.Add(cboText);
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich eine ähnliche Frage beantwortet vor einer Stunde finden Sie hier :http://stackoverflow.com/questions/9637514/add-usercontrol-to-listbox-wpf.
Werde ich rekapitulieren die wichtigsten Teile hier, basierend auf Ihrem Beispiel
In der XAML-müssen Sie erstellen eine "DataTemplate", das ist der XAML-Darstellung des file-Objekts - in Ihrem Fall ein Bild + Datei name. Sie können diese Datatemplate als Ressource und ordnen Sie ihn Ihrer ComboBox oder einfach legen Sie Sie in die combobox, wenn Sie nicht Vorhaben, Sie wieder zu verwenden
In Ihrer Codebehind, müssen Sie eine Struktur erstellen, represets die Daten, die Sie präsentieren möchten, in Ihrer combobox - lassen Sie uns sagen, ein "FileInfo" - Klasse. Die FileInfo-Klasse muss aussetzen "FileImage" und "Dateiname" als Eigenschaften, so dass Sie binden können, um Sie (wie oben gesehen).
Als Nächstes müssen Sie erstellen Sie eine Sammlung solcher Objekte in der code-behind der xaml du deine ComboBox in. Die Sammlung muss eine ObservableCollection.
So würden Sie smth like this:
und dann im Hauptfenster.xaml.cs
public ObservableCollection-Dateien { get; private set; }
public MainWindow()
{
InitializeComponent();
diese.DataContext = this;
Dateien = new ObservableCollection();
}
Werden Sie noch brauchen, um viel darüber gelesen warum dies funktionieren wird. Ich empfehle die Lektüre über DataTemplates DataBinding, ObservableCollection und am Ende, Lesen Sie über MVVM, ein Muster, Krawatten alle diese Sachen sehr schön und ermöglicht es Ihnen, zu nutzen, alle WPF-power und entkoppeln yor-Logik von der Benutzeroberfläche aus.
Einer Weise, die Sie berücksichtigen sollten für WPF/Silverlight/WP7 apps ist das MVVM design pattern.
In diesem Fall würden Sie einen Blick Modell mit der Sammlung von Gegenständen für Ihre
ComboBox
, und verwenden Sie einen verbindlichen Ausdruck zu erstellen, der dieItemsSource
desComboBox
. Sie würde dann Vorlage dieComboBox
Anzeige der Artikel Bilder.Blick in Datenbindung und Datenvorlagen, die nur C# - code, den Sie benötigen, ist hier, um die Dateien (obwohl Sie könnte auch tun, die in XAML mit so etwas wie eine
ObjectDataProvider
)Source
direkt im XAML-stattdessen könnte man auch die schaffen es nur, sobald als Ressource und verweisen dann im template mitStaticResource
, nicht verschwenden Zeit und Speicher. Um den Bindestrich in der gebundenenTextBlock
könnten SieBinding.StringFormat
oder erstellen Sie einfach ein weiteresTextBlock
. Als ich sagte, ich würde wahrscheinlich nur die Dateien in den code, alles andere ist leicht getan in XAML.