我一直在WPF工作2天,来自ASP.NET,请多多包涵!
我正在使用目录中的xml文件名填充ComboBox,并向每个项目添加一个图标。我的一切工作都很好,但是我想知道是否有一种“更好”,更“有效”的方式来做到这一点。正如我所说,我只是开始使用WPF,我想以“正确”的方式进行操作。我的工作代码如下,是否可以或者应该以其他方式进行处理?在此先感谢您提供任何指导!
<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);
}
}
最佳答案
一个小时前,我已经回答了类似的问题,请参见此处:http://stackoverflow.com/questions/9637514/add-usercontrol-to-listbox-wpf。
我将根据您的示例在这里重述最重要的部分
在XAML中,您需要创建“ DataTemplate”,即文件对象的XAML表示形式-在您的情况下为图像+文件名。您可以将此Datatemplate创建为资源并将其分配给ComboBox,或者如果您不打算重复使用它,则只需在组合框中创建它即可
<ComboBox ItemsSource="{Binding Files}">
<ComboBox.ItemTemplate>
<StackPanel>
<Image Source="{Binding FileImage}" Height="16" Width="16"/>
<TextBlock Margin="5" Text="{Binding FileName}" />
</StackPanel>
</ComboBox.ItemTemplate>
</ComboBox>
在您的Codebehind中,您需要创建一个结构来重新设置要在组合框中显示的数据-假设是一个“ FileInfo”类。 FileInfo类需要将“ FileImage”和“ FileName”公开为属性,以便您可以绑定到它们(如上所示)。
接下来,您需要在将ComboBox放入xaml的代码背后创建此类对象的集合。该集合必须是ObservableCollection。
因此,您将有如下内容:
public class FileInfo
{
public ImageSource FileImage { get; set; }
public string FileName { get; set; }
}
然后在MainWindow.xaml.cs中
公开的ObservableCollection文件{私人套装; }
公共MainWindow()
{
InitializeComponent();
this.DataContext = this;
文件=新的ObservableCollection();
foreach (string datei in dirFiles)
{
var fName = System.IO.Path.GetFileName(datei);
BitmapImage bitMap = new BitmapImage();
bitMap.BeginInit();
bitMap.UriSource = new Uri(@"tag.jpg", UriKind.Relative);
bitMap.EndInit();
Files.Add(new FileInfo(){FileName=fName, FileImage = bitMap});
}
}
您仍然需要阅读很多有关为什么这样做的信息。我建议阅读有关DataTemplates DataBinding,ObservableCollection的文章,最后阅读有关MVVM的文章,该模型很好地将所有这些东西联系在一起,并允许您利用所有WPF功能并将逻辑从UI分离出来。
关于c# - 以编程方式将项目添加到ComboBox,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9640045/