2011-01-23 15 views
5

साथ सूचीदृश्य बनाएँ।WPF - मैं एक बहुत ही सरल सवाल है माउस

मैं एक ListView नियंत्रण है और मुझे पता है कि बाईं ओर एक आइकन के साथ एक आइटम बनाने का तरीका चाहते हैं। आइटम गतिशील रूप से कोड में सी # में और XAML के माध्यम से नहीं जोड़ा जाएगा।

छवि नमूना: here

कुछ ऊपर (प्रबंधित रिकॉर्ड्स हेडर को छोड़कर) के समान है। मैं गतिशील रूप से ग्रिड बनाकर उपर्युक्त करने में कामयाब रहा (एक सूची दृश्य नियंत्रण का उपयोग नहीं कर रहा) लेकिन मुझे यकीन नहीं है कि ईवेंट को कैसे नियंत्रित करें (क्लिक करें, आदि)।

अग्रिम धन्यवाद। :)

+2

लिंक टूटा हुआ, मैं imgur के अलावा एक सेवा का उपयोग करूंगा, क्योंकि 9/10 imgur लिंक जो मैं इंटरनेट पर देखता हूं टूट जाता है। – msbg

उत्तर

9

समाधान अधिभावी दृश्य आइटम DataTemplate में होते हैं।

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" 
    xmlns:self="clr-namespace:WpfApplication1" 
    xmlns:props="clr-namespace:WpfApplication1.Properties"> 
<Window.Resources> 
    <self:ImageConverter x:Key="Conv"/> 

    <DataTemplate x:Key="Template"> 
     <StackPanel Orientation="Horizontal"> 
      <Image Source="{Binding Path=Icon, Converter={StaticResource Conv}}" 
        Width="64" 
        Height="64"/> 
      <TextBlock Text="{Binding Name}" 
         VerticalAlignment="Center"/> 
     </StackPanel> 
    </DataTemplate> 

</Window.Resources> 
<StackPanel> 
    <ListView ItemsSource="{Binding Items}" 
       ItemTemplate="{StaticResource Template}"/> 
</StackPanel> 

फिर हम इस दृश्य के पीछे कोड में दृश्य के DataContext के रूप में हमारे PresentationModel सेट करने के लिए:

public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = new SampleModel(); 
    } 

आप XAML में अभिव्यक्ति बाध्यकारी हमारे प्रस्तुति मॉडल आइटम संपत्ति का खुलासा करना चाहिए से देख सकते हैं (यदि आप ListView करने के क्रम में क्रम में वस्तुओं की सूची में परिवर्तन, अंतर्निहित संग्रह ObservableCollection होना चाहिए पर विचार अपने परिवर्तन पर प्रतिक्रिया करते हैं):

public class SampleModel 
{ 
    public IEnumerable<ViewData> Items 
    { 
     get 
     { 
      yield return new ViewData(Properties.Resources.airbrush_256, "item 1"); 
      yield return new ViewData(Properties.Resources.colors_256, "item 2"); 
      yield return new ViewData(Properties.Resources.distribute_left_edge_256, "item 3"); 
      yield return new ViewData(Properties.Resources.dossier_ardoise_images, "item 4"); 
     } 
    } 
} 

public class ViewData 
{ 
    public ViewData(Bitmap icon, string name) 
    { 
     this._icon = icon; 
     this._name = name; 
    } 

    private readonly Bitmap _icon; 
    public Bitmap Icon 
    { 
     get 
     { 
      return this._icon; 
     } 
    } 

    private readonly string _name; 
    public string Name 
    { 
     get 
     { 
      return this._name; 
     } 
    } 
} 
इस समाधान मैं Properties.Resources वर्ग के लिए मौजूदा PNG छवियाँ जोड़ने में

। तब प्रतीक टाइप बिटमैप कि स्रोत संपत्ति प्रकार के साथ असंगत है, इसलिए हम अगले कनवर्टर के साथ BitmapSource को परिवर्तित करना चाहिए:

public class ImageConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value is Bitmap) 
     { 
      var stream = new MemoryStream(); 
      ((Bitmap)value).Save(stream, ImageFormat.Png); 

      BitmapImage bitmap = new BitmapImage(); 
      bitmap.BeginInit(); 
      bitmap.StreamSource = stream; 
      bitmap.EndInit(); 

      return bitmap; 
     } 
     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

दूसरी ओर आप के बजाय संसाधनों का प्रतीक के भंडारण के लिए pack uri's उपयोग कर सकते हैं। फिर आपकी व्यूडाटा कक्षा यूरी (बिटमैप के बजाए) की संपत्ति का पर्दाफाश करेगी। फिर कोई कन्वर्टर्स की आवश्यकता नहीं है।

+0

बहुत बहुत धन्यवाद! यह पूरी तरह से काम करता है :) – James

संबंधित मुद्दे