如何在ListView中显示实际图像而不是它的位置?

时间:2015-06-10 08:21:45

标签: c# wpf xaml

我发现这段代码可以将图片添加到WPF中的ListView中。但是它只显示图像位置而不是实际图像:

            var image = new BitmapImage();

            string fileName = @"C:\Peak Sourcing\Work\ppt_test\slides_png\slide1.png";

            using (var stream = new FileStream(fileName, FileMode.Open))
            {
                image.BeginInit();
                image.CacheOption = BitmapCacheOption.OnLoad;
                image.StreamSource = stream;
                image.EndInit();
            }


            ListBoxItem item = new ListBoxItem();
            Thumbnails.Items.Add(image);

背后的XAML很简单:

<ListView Name="Thumbnails" Margin="10,10,804,10" >
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Columns="1"/>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>



 </ListView>

我也发现很少有其他代码,但所有代码只是将图像位置显示为字符串而不是图像。你能帮我解决一下吗?

3 个答案:

答案 0 :(得分:5)

这可以添加到XAML:

/usr/include/x86_64-linux-gnu

你需要一个模型:

<?php 
  $w = 0;
  for ($i = 0; $i < count($newGambar); $i++) {
    if ($w % 4 == 0){
    $banyak++;
  }
  $w++;
  echo $banyak;
?>

}

背后的代码示例:

        <ListView  x:Name="lv" Background="WhiteSmoke" 
                   Height="500" 
                   ItemsSource="{Binding models}">
            <ListView.View>
                <GridView>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Image Source="{Binding ImagePath}" 
                                       HorizontalAlignment="Left" 
                                       Stretch="Fill" 
                                       Height="100"
                                       Width="100"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>

}

这是解决此问题的最简单,最快捷的方法。如果你需要MVVM只需举手,我们就可以得到一个Command而不是那个Click事件。还有一件事,你有一个图像列表吗?如果是这样,我们将不得不使用ObservableCollection并实例化许多模型,以便为所有按钮提供信息。

  • ImageSource是我的程序集名称。

  • 图片是我项目中创建的文件夹。

为了填充ListView,您需要public class Model : INotifyPropertyChanged { private Uri _ImagePath; public Uri ImagePath { get { return _ImagePath; } set { _ImagePath = value; PropertyChanged(this, new PropertyChangedEventArgs("ImagePath")); } } public event PropertyChangedEventHandler PropertyChanged = delegate { }; 定义如下:

public partial class MainWindow : Window
{
public Model ImageModel { get; set; }

public MainWindow()
{
    InitializeComponent();

    ImageModel = new Model();
    ImageModel.ImagePath = new Uri(@"/ImageSource;component/Images/Image1.jpg", UriKind.RelativeOrAbsolute);
    this.DataContext = ImageModel;
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    ImageModel.ImagePath = new Uri(@"/ImageSource;component/Images/Image2.jpg", UriKind.RelativeOrAbsolute);
}

在构造函数中初始化它:

ObservableCollection<Model>

并向其添加一些Model实例,其图像路径设置如上所示。

答案 1 :(得分:2)

您缺少实际显示BitmapImage对象的DataTemplate:

<ListView Name="Thumbnails" ... >
    ...
    <ListView.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding}" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

如果没有DataTemplate,ListViewItem只显示数据项的ToString()方法的输出。

然后(没有任何MVVM)显示文件夹中所有PNG文件的简单方法是:

Thumbnails.ItemsSource = Directory
    .EnumerateFiles(@"C:\Peak Sourcing\Work\ppt_test\slides_png", "*.png")
    .Select(f => new BitmapImage(new Uri(f)));

答案 2 :(得分:0)

您要将BitmapImage添加为ListViewItem,这不是可视的(因此不会呈现)并显示为ToString()

通常在这种情况下你应该使用DataTemplates,但这也适用于你:

var fileName = @"C:\Peak Sourcing\Work\ppt_test\slides_png\slide1.png";
var bitmap = new BitmapImage(new Uri(fileName)) { /*.. more bitmap image options if you like .. */ };
var image = new Image() { Source = bitmap /*.. more image options ..*/ }
Thumbnails.Items.Add(image);