我一直在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/

10-13 08:24