2012-02-15 45 views
1

WPFでListBoxに画像を表示したい。どのような私が達成したいことはイメージのための装置からListBoxに画像を読み込む

  1. 読むに従い、名前などのような情報を取得する(DONE)
  2. される実際の親指の代わりに、リストボックスと表示デフォルトの親指(いくつかのデフォルトPIC)でアイテムを作成親指は後で画像のために読み込まれるからです。 (完了)
  3. サムネイルを取得して(DONE)フォルダに保存します。仕事でやっている。

  4. NOWは実際の画像のサムを示しています。 ( まだ完成してない)。

ステップ4はスタックされています。基本的には、最初に画像/動画アイコンを表示して親指を埋めるウィンドウと似ています。

助けてください。私はWPFに新しいので、問題に直面しています。

+0

ステップ1〜3のコードを表示できますか? – gideon

+0

どのようにこれをやっているかについての情報が少なくとも必要です。 DataTemplatesを使用して、リストボックスをカスタムデータ型のリストにバインドしていますか? –

答えて

1
<ListBox ItemsSource="{Binding Items}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid Margin="5"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="50"/> 
         <ColumnDefinition Width="10"/> 
         <ColumnDefinition Width="Auto"/> 
        </Grid.ColumnDefinitions> 
        <Image Source="{Binding Image}"/> 
        <Grid Grid.Column="2"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="*"/> 
          <RowDefinition Height="*"/> 
          <RowDefinition Height="*"/> 
         </Grid.RowDefinitions> 
         <TextBlock Text="{Binding Name}"/> 
         <TextBlock Grid.Row="1" Text="{Binding Desc}"/> 
         <TextBlock Grid.Row="2" Text="{Binding Notes}"/> 
        </Grid> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

public partial class ImageListBox : INotifyPropertyChanged 
{ 
    private ObservableCollection<Item> _items; 
    public ObservableCollection<Item> Items 
    { 
     get { return _items; } 
     set { _items = value; OnPropertyChanged("Items"); } 
    } 

    public ImageListBox() 
    { 
     DataContext = this; 
     Items = new ObservableCollection<Item>(new List<Item> 
                { 
                 new Item { Image = "Images/_(1).png" , Desc = "Desc1",Name = "Name1",Notes = "Notes1"}, 
                 new Item { Image = "Images/_(2).png" , Desc = "Desc2",Name = "Name2",Notes = "Notes2"}, 
                 new Item { Image = "Images/_(3).png" , Desc = "Desc3",Name = "Name3",Notes = "Notes3"}, 
                 new Item { Image = "Images/_(4).png" , Desc = "Desc4",Name = "Name4",Notes = "Notes4"}, 
                 new Item { Image = "Images/_(5).png" , Desc = "Desc5",Name = "Name5",Notes = "Notes5"}, 
                }); 
     InitializeComponent(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(String propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this,new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public class Item 
{ 
    public String Image { get; set; } 
    public String Name { get; set; } 
    public String Desc { get; set; } 
    public String Notes { get; set; } 
} 
1

私は正しくあなたの質問を理解していない可能性がありますが、私はそれが正しい得た場合:あなたは、いくつかのWPFコントロールに画像を表示したいです。

1)コントロール(私はデータグリッドを使用)へのあなたのイメージにバインドパス:

<DataGrid ItemsSource="{Binding Path=ImageCollection}" 
     <DataGrid.Columns>      
          <DataGridTemplateColumn Header="Image"> 
           <DataGridTemplateColumn.CellTemplate> 
            <DataTemplate> 
             <Image Width="40" Height="20" Source="{Binding FilePath, Converter={StaticResource ResourceKey=ImageConverter}}"/> 
            </DataTemplate> 
           </DataGridTemplateColumn.CellTemplate> 
          </DataGridTemplateColumn> 
</DataGrid> 

2)ImageSourceはへのファイルパスを変換コンバータを作成します(私はどこか)は、インターネットでそれを見つけた:

public class ImageConverter : IValueConverter 
    { 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
      { 
       var path = value as string; 

       if (path == null) 
       { 
        return DependencyProperty.UnsetValue; 
       } 
       //create new stream and create bitmap frame 
       var bitmapImage = new BitmapImage(); 
       bitmapImage.BeginInit(); 
       try 
       { 
        bitmapImage.StreamSource = new FileStream(path, FileMode.Open, FileAccess.Read); 
        //load the image now so we can immediately dispose of the stream 
        bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
        bitmapImage.EndInit(); 
        //clean up the stream to avoid file access exceptions when attempting to delete images 
        bitmapImage.StreamSource.Dispose(); 
        return bitmapImage; 
       } 
       catch (Exception) 
       {   
        //do smth 
       } 

      } 
} 

希望すると、これが役立ちます。

0

これにはさまざまな方法があります。最初にPriorityBindingを使用して、プレースホルダーアイコンと親指を最初に表示します。 (イメージが完全にロードされた後にイメージを保持するプロパティを割り当てる必要があるかもしれません)

関連する問題