2015-06-10 57 views
2

我發現這個代碼添加圖片到WPF中的ListView。但是,僅顯示圖像的位置,而不是實際的圖像:如何在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> 

我還發現了其他一些代碼,但他們只顯示圖像的位置作爲字符串而不是圖像。你能幫我解決這個問題嗎?

+0

你實例化一個新的'ListBoxItem',但也無可奈何它。是不是缺少的東西? –

+0

對不起,該行是額外的 – user1394252

回答

0

你加入BitmapImageListViewItem,這是不可視的(所以它不不呈現)並顯示爲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); 
+0

謝謝你的回答。然而,它抱怨這一行: – user1394252

+0

var bitmap = new BitmapImage(fileName); – user1394252

+0

它說「無效的參數」 – user1394252

4

這可以被添加到XAML:

 <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> 

佑需要爲這個模型:對於後面的代碼

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); 
} 

}

這是解決此問題的最簡單,最快捷的方法。如果你需要MVVM,只需舉手,我們可以得到一個Command而不是那個Click事件。還有一件事,你有圖像清單嗎?如果是這樣,我們將不得不使用一個ObservableCollection並實例化許多模型,以便提供所有按鈕。

  • ImageSource是我的程序集名稱。

  • 圖像是在我的項目中創建的文件夾。

爲了填充ListView,你需要這樣定義一個ObservableCollection<Model>

 public ObservableCollection<Model> models { get; set; } 

初始化它在構造函數中:

 models = new ObservableCollection<Model>(); 

和一些模型實例添加到它自己的圖像路徑設置如上所示。

+0

謝謝。是的,我有一個包含大約20張圖片的文件夾,我想動態添加到列表中。 – user1394252

+0

@ user1394252遍歷文件,獲取路徑,爲每個文件實例化Model對象並設置其ImagePath。將每個新對象添加到模型ObservableCollection 。綁定已經通過XAML中的ItemsSource屬性創建,DataContext在構造函數中設置.. –

1

你缺少一個實際顯示的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))); 
相關問題