2017-03-06 56 views
0

如何在ListView中創建圖像項目?我需要不使用xaml,只使用C#。我正在衝浪約40分鐘,並沒有發現。 我試了很多東西,我在這裏停止 在第一列中,我只看到「System.Windows.Controls.StackPanel」。將圖像添加到ListView C#WPF(無xaml)

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     GridView grView = new GridView(); 
     GridViewColumn gwCol1 = new GridViewColumn(); 
     GridViewColumn gwCol2 = new GridViewColumn(); 
     gwCol1.Header = "Avatar"; 
     gwCol2.Header = "Name"; 
     gwCol2.DisplayMemberBinding = new Binding("name"); 
     gwCol1.DisplayMemberBinding = new Binding("stack"); 
     grView.Columns.Add(gwCol1); 
     grView.Columns.Add(gwCol2); 
     listView1.View = grView; 
     // 
     var list = new List<XData>(); 
     listView1.ItemsSource = list; 
     // 
     BitmapImage image1 = new BitmapImage(new Uri(@"C:\Users\montana\OneDrive\Pictures\Saved Pictures\WVQfZqY.jpg")); 
     Image img = new Image(); 
     img.Width = 100; 
     img.Height = 100; 
     img.Source = image1; 
     StackPanel stackPanel1 = new StackPanel(); 
     stackPanel1.Orientation = Orientation.Horizontal; 
     stackPanel1.Children.Add(img); 
     list.Add(new XData() { name="hola", stack=stackPanel1 }); 

    } 
} 


class XData 
{ 
    public string name { get; set; } 
    // public string url { get; set; } 
    public StackPanel stack { get; set; } 
} 
+2

* 「無XAML」 *是矛盾的,你有一些'listView1'這裏這簡直是缺乏的DataTemplate(?ItemTemplate中) 。沒有它,你必須顯式地(創建'ListBoxItem'](http://stackoverflow.com/a/13267883/1997232)(傳遞位圖作爲其內容)而不是傳遞一些List作爲ItemsSource。 – Sinatr

+0

除此之外,您應該使用ObservableCollection而不是List,或者在將List分配給ItemsSource屬性之前添加項目。 – Clemens

+0

爲什麼在ListView本身在XAML中聲明時,在代碼後面創建GridView及其列? – Clemens

回答

0

這是什麼產生想要的結果。


變化XData定義,以避免出現視圖元素(你沒有提到MVVM,但它是很好的堅持):

class XData 
{ 
    public string Name { get; set; } 
    public string Path { get; set; } 
} 

現在,您可以定義數據xaml中的模板(通用解決方案)或generate it in code behind是這樣的:

var factory = new FrameworkElementFactory(typeof(Image)); 
factory.SetValue(Image.SourceProperty, new Binding(nameof(XData.Path))); 
factory.SetValue(Image.WidthProperty, 100.0); 
factory.SetValue(Image.HeightProperty, 100.0); 
var dataTemplate = new DataTemplate { VisualTree = factory }; 

數據模板可以像你喜歡的那樣複雜,但是很明顯在xaml中定義它,然後使用FindResource()加載更容易,請考慮使用此選項。

然後這個DataTemplate中已被指定爲CellTemplate這樣的:

GridView grView = new GridView(); 
grView.Columns.Add(new GridViewColumn { Header = "Avatar", CellTemplate = dataTemplate }); 
grView.Columns.Add(new GridViewColumn { Header = "Name", DisplayMemberBinding = new Binding(nameof(XData.Name)) }); 
listView1.View = grView; 

注意:你不應該列與CellTemplate使用DisplayMemberBinding

現在,終於,你可以通過設置ItemSource像往常一樣填寫ListView

var list = new List<XData>(); 
list.Add(new XData { Name = "hola", Path = @"c:\temp\1.jpg" }); 
list.Add(new XData { Name = "hola2", Path = @"c:\temp\2.png" }); 
listView1.ItemsSource = list; 
+0

謝謝。但是,我怎樣才能取代nameof?使用visual studio 2012 – AndrewMontana

+0

而不是'nameof(somemember)'使用''somemember「'(在你的情況下它是''Name''和''Path'')。 – Sinatr

+0

工作)再次感謝! – AndrewMontana