2012-02-15 5 views
1

WPF로 ListBox에 이미지를 표시하려고합니다. 내가 달성하고자하는 이미지 장치에서ListBox에 이미지로드

  1. 읽기 다음 등 이름 등의 정보를 얻을 수있다
  2. 실제 엄지 손가락 대신에 목록 상자 및 디스플레이 기본 엄지 손가락 (일부 기본 그림)의 항목을 만들 (완료) 엄지 손가락은 이미지를 위해 나중에 읽힐 것이다. (완료)
  3. 이제 미리보기 이미지를 가져 와서 폴더에 저장합니다 (완료). 작업으로 완료됩니다.

  4. 이제 실제 이미지의 엄지 손가락을 보여줍니다. (완료하지 않음).

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) 제어 (I가 데이터 그리드를 사용)에 대한 이미지에 바인딩 경로 :

<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을 사용하여 자리 표시 자 아이콘과 엄지 손가락을 먼저 표시합니다. 이미지가 완전히로드 된 후에 만 ​​이미지를 보유하는 속성을 할당해야 할 수 있습니다.