我知道这基本上是一堆人的重复问题,但是我遇到了困难,我的组合框列出了hdds,点击时他们应该用图片填充列表框,这要归功于之前的帮助,这样运行没有错误,除了该列表框没有显示任何内容,我将它绑定在项目模板等中,因此我不知道为什么没有显示
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
private void HDDSelectionBox_Loaded(object sender, RoutedEventArgs e) //ComboBox Lists Local Hardrives
{
string[] drives = Environment.GetLogicalDrives(); //Drive Letters, Into A String Array
foreach (string drive in drives)
{
HDDSelectionBox.Items.Add(drive); //Adds Each Drive Letter As A Combox Box Item
}
}
public List<Photos> LoadImages ///List Retrieves and Loads Photos
{
get
{
List<Photos> images = new List<Photos>();
if (HDDSelectionBox.SelectedItem != null) //If a item has been selected
{
foreach (string filename in System.IO.Directory.GetFiles(HDDSelectionBox.SelectedItem.ToString()))
{
try
{
images.Add( //Add To List
new Photos(
new BitmapImage(
new Uri(filename)),
System.IO.Path.GetFileNameWithoutExtension(filename)));
}
catch { ; } //Skips Any Image That Isn't Image/Cant Be Loaded
}
}
return images;
}
}
}
public class Photos
{
private ImageSource _image;
private string _name;
public Photos(ImageSource image, string name)
{
_image = image;
_name = name;
}
public override string ToString()
{
return _name;
}
public ImageSource Image
{
get { return _image; }
}
public string Name
{
get { return _name; }
}
} // END MyImage CLASS
}
XAML
<Window.Resources>
<DataTemplate x:Key="MyImageTemplate">
<StackPanel>
<Image
Source="{Binding Image}" Width ="100" Height="100" />
<TextBlock Text ="{Binding Name}" Width = "100" />
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<DockPanel LastChildFill="False">
<ListBox
Name="ImageListBox"
DockPanel.Dock = "Right"
ItemsSource = "{Binding LoadImages}"
ItemTemplate="{StaticResource MyImageTemplate}"
Width="200"/>
<ComboBox Width="80" Height="50" DockPanel.Dock="Top" Name="HDDSelectionBox" Loaded="HDDSelectionBox_Loaded" ></ComboBox>
</DockPanel>
</Grid>
答案 0 :(得分:0)
我认为您应该将组合框的ItemsSource
绑定到SelectedItem
并提供一些Converter
来将所选项目转换为相应的List<Photo>
。否则,当组合框的LoadImages
发生更改时,您必须通知SelectedItem
属性的更改。尝试以下代码(在过程代码和XAML代码中修改):
代码:
public class SelectedItemToLoadImagesConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture){
List<Photos> images = new List<Photos>();
if (value != null) //If a item has been selected
{
foreach (string filename in System.IO.Directory.GetFiles(value.ToString()))
{
try
{
images.Add( //Add To List
new Photos(
new BitmapImage(
new Uri(filename)),
System.IO.Path.GetFileNameWithoutExtension(filename)));
}
catch { ; } //Skips Any Image That Isn't Image/Cant Be Loaded
}
}
return images;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){
throw new NotImplementedException();
}
}
XAML代码:
<Window.Resources>
//...
<local:SelectedItemToLoadImagesConverter x:Key="imagesConverter"/>
</Window.Resources>
<DockPanel LastChildFill="False">
<ListBox
Name="ImageListBox"
DockPanel.Dock = "Right"
ItemsSource = "{Binding ElementName=HDDSelectionBox,Path=SelectedItem,Converter={StaticResource imagesConverter}}"
ItemTemplate="{StaticResource MyImageTemplate}"
Width="200"/>
<ComboBox Width="80" Height="50" DockPanel.Dock="Top" Name="HDDSelectionBox" Loaded="HDDSelectionBox_Loaded" ></ComboBox>
</DockPanel>
</Grid>
请注意,您可以删除代码中的LoadImages
属性。另请注意,我使用local
前缀作为项目命名空间的引用,其中定义了类SelectedItemToLoadImagesConverter
,我希望您知道如何在XAML代码中定义xmlns
。< / p>
答案 1 :(得分:0)
好吧,我先问你一个简单的问题:如果我们 假设 你只有C:驱动器,那么C:\文件夹是否包含任何图像?
如果是,那么我们将讨论可能在代码中的下一个问题。
如果不是,那么显然,你没有任何东西可以展示。但是,如果您在子文件夹中有图像,则可能需要更改对API GetFiles
的使用。正确的应该从所有子文件夹中获取文件:
foreach (string filename in System.IO.Directory.GetFiles(
value.ToString(),
"*.png", //assuming that you want PNG images only
System.IO.SearchOption.AllDirectories))
有关GetFiles的更多信息,here。
如果这样可以解决您的问题,那么您可能需要对其进行增强以使用图像枚举,因为在整个驱动器中搜索文件可能需要相当长的时间,在此期间您的应用将无法响应。