2017-04-04 24 views
0

我在学校学习WPF,但遇到了将新图片上传到我的项目的问题。WPF:如何将图片上传到您的项目并在稍后作为资源使用

目标是能够使用文件浏览器添加图像(在运行时)。该图像应该上传到项目中,并且文件名应该保存在数据库中。比它应该可以作为项目中的资源进行访问,以便我可以在列表框中显示图像。

这是我到目前为止有:

图,其中载情况:

<Image Height="70px" Source="{Binding newImg}"/> 
    <Button Height="23" Name="btnLoad" VerticalAlignment="Bottom" 
    Width="75" Grid.Column="0" Grid.Row="1" Command="{Binding ImgUploadCommand}">_Browse</Button> 

视图模型UploadView

private string fullPath; 
    private BitmapImage image; 
    private Patient newPatient = new Patient(); 

    private void KoppelenCommands() 
    { 
     FotoUploadCommand = new BaseCommand(FotoPatientUpload); 
     PatientOpslaanCommand = new BaseCommand(PatientOpslaan); 
    } 

    public ICommand FotoUploadCommand { get; set; } 
    public ICommand PatientOpslaanCommand { get; set; } 

    public void FotoPatientUpload() 
    { 
     OpenFileDialog op = new OpenFileDialog(); 
     op.Title = "Select a picture"; 
     op.Filter = "All supported graphics|*.jpg;*.jpeg;*.png|" + 
      "JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|" + 
      "Portable Network Graphic (*.png)|*.png"; 
     if (op.ShowDialog() == true) 
     { 
      image= new BitmapImage(new Uri(op.FileName)); 
      fullPath = op.FileName; 
      string[] partsFileName = fullPath.Split('\\'); 
      System.Windows.MessageBox.Show(delenFileName[(partsFileName.Length - 1)]); 
      NewPatient.Image= partsFileName[(delenFileName.Length - 1)]; 
     } 
    } 

    public void PatientOpslaan() 
    { 

       string destinationPath = GetDestinationPath(NewPatient.Afbeelding, "\\assets\\images"); 

       File.Copy(fullPath, destinationPath, true); 


      //dataservice (My DS works fine, I can see the correct filename in the database but I save only the name not the Path) 
      PatientDataService patientDS = 
       new PatientDataService(); 

      patientDS.InsertPatient(NewPatient); 


     } 
     else 
     { 
      MessageBox.Show("Niet alle velden zijn ingevuld! Een nieuwe patient moet tenminste een naam en een voornaam krijgen!", "Fout!", MessageBoxButton.OK, MessageBoxImage.Error); 
     } 
    } 


    //opslaan foto in opgegeven map <<Code afkomstig van stackoverflow auteur: Yashpal Singla>> 
    private static String GetDestinationPath(string filename, string foldername) 
    { 
     String appStartPath = System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); 

     appStartPath = String.Format(appStartPath + "\\{0}\\" + filename, foldername); 
     return appStartPath; 
    } 

图像正确保存到bin /调试/ assets/images文件夹,但不作为资源。因为它不会被保存作为一种资源,我不能在我的主窗口视图中使用它看起来像这样:

   <ListBox HorizontalContentAlignment="Center" ItemsSource="{Binding Patienten}" SelectedItem="{Binding SelectedPatient}" Grid.Column="0" Grid.Row="0"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition></ColumnDefinition> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition></RowDefinition> 
          <RowDefinition></RowDefinition> 
         </Grid.RowDefinitions> 
         <TextBlock Name="ImageNameListBox" Visibility="Collapsed" 
            Text="{Binding Image, StringFormat=../assets/images/{0}}" /> 
         <Border Style="{StaticResource imageBorderStyle}" Grid.Column="0" Grid.Row="0" Height="80px" Width="80px"> 
          <Rectangle Margin="1,-2,-2,1" Height="80px" Width="80px"> 
           <Rectangle.Fill> 
            <ImageBrush ImageSource="{Binding Text, ElementName=ImageNameListBox}"/> 
           </Rectangle.Fill> 
          </Rectangle> 
         </Border> 
        </Grid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

主窗口视图模型:

class MainWindowViewModel : BaseViewModel 
{ 

    private DialogService dialogService; 
    private ObservableCollection<Patient> patienten; 

    public ObservableCollection<Patient> Patienten 
    { 
     get 
     { 
      return patienten; 
     } 

     set 
     { 
      patienten = value; 
      NotifyPropertyChanged(); 
     } 
    } 
    private Patient selectedPatient; 
    public Patient SelectedPatient {get; set;} 
    public MainWindowViewModel() 
    { 
     LoadingPatients(); 


     //instantiëren DialogService als singleton 
     dialogService = new DialogService(); 
    } 

    private void LoadingPatients() 
    { 
     //instantiëren dataservice 
     PatientDataService patientDS = 
      new PatientDataService(); 

     Patienten = new ObservableCollection<Patient>(patientDS.GetPatienten()); 
    } 
    } 

请注意,我并没有包括所有的代码,所以我的datacontext设置ViewModelLocator,你不能在这里看到。

有什么办法可以将图像保存为资源,还是必须在启动时将/ bin/debug/assets/images文件夹中的所有图像转换为资源?如果是这样,我该怎么做?

道歉,我的英语,我不是一个母语

感谢那些谁有勇气一路读到这条线,并感谢那些谁可以帮帮我!

回答

1

您可以从您的文件中将图像加载为ImageSource,并将其绑定到您的视图中的Image

public class MyViewModel 
{ 
    public void LoadImage() 
    { 
     ImageSource = new BitmapImage(new Uri("assets/images/yourImage.jpg", UriKind.Relative)); 
    } 

    public ImageSource ImageSource { get; set; } 
} 

在视图:

<Image Source="{Binding Path=ImageSource}"></Image> 

至于答案的评论,这个作品也一个列表框里面。

查看

<ListBox ItemsSource="{Binding Path=MyImages}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <Image Source="{Binding Path=ImageSource}"/> 
        <TextBlock Text="{Binding Path=Name}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

视图模型

public class MainWindowViewModel 
{ 
    public void LoadImages() 
    { 
     var d = new DirectoryInfo("assets/images"); 
     var images = d.GetFiles(); 
     MyImages = images.Select(x => new MyImageModel(x.Name, new BitmapImage(new Uri(x.FullName)))); 
    } 

    public IEnumerable<MyImageModel> MyImages { get; set; } 
} 

MyImageModel

public class MyImageModel 
{ 
    public MyImageModel(string name, ImageSource imageSource) 
    { 
     Name = name; 
     ImageSource = imageSource; 
    } 

    public string Name { get; set; } 

    public ImageSource ImageSource { get; set; } 
} 
+0

我相信这会为一个单一的不稳定型心绞痛患者工作nt对象,但我也需要它在一个列表框中。我得到一个ObservableCollection of Patients(你不知道是因为我没有放在上面,我的不好),它们的文件名与我用来填充列表框的图像不同。 –

+0

我已经添加了一个列表框的例子。 – take

+0

嗯,首先让我说感谢帮助我,第二我试图加入这个,但问题是,我用病人对象填充我的列表框。其中一些没有图像集,所以我显示一个默认的。您提供的解决方案不会给我oppertunity(我认为)将图像链接到患者。我尝试将模型部件添加到PatientModel,但我不知道如何获取该图像并将其转换为imageSource。 –

相关问题