2011-12-21 3 views
2

내 WPF 애플리케이션에서 jpeg 파일을 동적으로 생성합니다. bin/Debug 또는 bin/Release에 저장됩니다.DataBinding은 WPF에서 동적으로 jpeg를 생성했습니다.

는 그래서 같은 ValueConverter를 사용하는 이미지 컨트롤과 데이터 바인딩 WrapPanel 있습니다

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    return new Uri(value.ToString(), UriKind.RelativeOrAbsolute); 
} 

값에 대한 예제 값은 내가 가정 Images\400\26.jpg가 빈 \ 디버그 또는 빈 \ 출시에보고 기본적으로입니다 .

제 문제는 동적으로 생성 된 jpeg에 이미지 컨트롤을 databind 할 수없는 것 같습니다. 그러나 Include으로 표시하고 BuildActionContent 인 다른 jpeg로 데이터 바인딩 할 수 있습니다.

어떻게 컴파일 타임에 존재하지 않는 동적으로 생성 된 이미지에 데이터 바인딩합니까?

+0

당신이 동적으로 생성 된 이미지의 목록보기에 표시 목록을 얻을 것이다이 시점에서

 private void dynamicallyJpegCreator(string newImagePath) { // Creating Image code // ..... // Create new image at newImagePath m_viewModel.Add(new System.Uri(newImagePath, System.UriKind.RelativeOrAbsolute)); } 

:

마지막으로, 우리는 당신의 동적 JPEG 창조자 기능을 수정할 수 있습니다 프로젝트에 "포함 된"파일로 제한됩니다. 이미지 myImage3 = new Image(); BitmapImage bi3 = 새 BitmapImage(); bi3.BeginInit(); bi3.UriSource = new Uri ("smiley_stackpanel.PNG", UriKind.Relative); bi3.EndInit(); myImage3.Stretch = 늘이기. 채우기; myImage3.Source = bi3; – Paparazzi

답변

4

이미지 경로 모음을 만들고 새로 만든 이미지 경로를 추가 할 수 있습니다. 이제 랩퍼 넬을이 컬렉션에 바인딩 할 수 있습니다.

이 컬렉션을 ViewModel 클래스에 구현 한 다음이 ViewModel 클래스를 DataContext로 만들고 변환기를 사용하여 wrapPanel을 해당 컬렉션에 바인딩 할 수 있습니다.

편집 :

using System.Windows; 

namespace wpfJpegBindingSample 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = m_viewModel = new MainWindowViewModel(); 
     } 

     private MainWindowViewModel m_viewModel; 
    } 
} 

MainWindow.xaml :

MainWindowViewModel.cs :

using System; 
using System.ComponentModel; 
using System.Collections.ObjectModel; 

namespace wpfJpegBindingSample 
{ 
    class MainWindowViewModel : INotifyPropertyChanged 
    { 
     #region INotifyPropertyChanged 
     public event PropertyChangedEventHandler PropertyChanged; 

     // Create the OnPropertyChanged method to raise the event 
     protected void OnPropertyChanged(string name) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(name)); 
      } 
     } 
     #endregion 

     //constructor 
     public MainWindowViewModel() 
     { 
      m_imagesList = new ObservableCollection<Uri>(); 
     } 

     //collection of images' Uris 
     private ObservableCollection<Uri> m_imagesList; 

     //property for the collection (so you can bind to it) 
     public ObservableCollection<Uri> ImagesList 
     { 
      get 
      { 
       return m_imagesList; 
      } 
     } 

     //an Add method that update the bindings 
     public void Add(Uri uri) 
     { 
      ImagesList.Add(uri); 
      OnPropertyChanged("ImagesList"); 
     } 

    } 
} 

MainWindow.xaml.cs를 여기에 샘플 파일입니다

<Window x:Class="wpfJpegBindingSample.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ListView ItemsSource="{Binding ImagesList}"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <WrapPanel> 
         <Image Source="{Binding}"/> 
        </WrapPanel> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 

    </Grid> 
</Window> 

여러분도 알다시피, th 뷰 모델 우리는 이미지의 우리스 컬렉션을 정의했습니다. 메인 윈도우 코드에서 우리는 창 데이터 컨텍스트로 뷰 모델의 객체를 설정하고, xaml에서는 listView (또는 선택한 다른 컨트롤)의 Item 소스를 ImagesList 속성의 바인딩으로 설정했습니다. 뷰 모델 인 데이터 컨텍스트 가되지 않을 수도로서 당신은 뒤에 코드를 시도 할 수 있습니다

+2

@Lee : 당신이 내 대답을 반대표를하는 것을 보았습니다. 그것이 당신을 도왔습니까? 그렇다면 해결책으로 표시하십시오. – Seffix

관련 문제