2013-05-28 60 views
0

这里的新手问题。我有这个文件选择器:从另一个方法调用文件

public async void PickImage() 
{ 
    FileOpenPicker ImagePicker = new FileOpenPicker(); 
    ... 
    StorageFile file = await ImagePicker.PickSingleFileAsync(); // 
    ... 
} 

而我想在另一种方法中使用此图像选择器设置的文件。就像这样:

private async void CreateButton_Click(object sender, RoutedEventArgs e) 
{ 
    ...       the one from PickImage() 
            v 
    StorageFile copyImage = await file.CopyAsync(DateTimeFolder, "image", NameCollisionOption.ReplaceExisting); 
    ... 
} 

这显然不是这样工作的。我该怎么做?


好吧,根据我得到的答案,这是我想出了:

public async Task<StorageFile> PickImage() 
{ 
    FileOpenPicker ImagePicker = new FileOpenPicker(); 
    ImagePicker.FileTypeFilter.Add(".jpg"); 
    ImagePicker.FileTypeFilter.Add(".jpeg"); 
    ImagePicker.FileTypeFilter.Add(".png"); 
    ImagePicker.ViewMode = PickerViewMode.Thumbnail; 
    ImagePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; 
    StorageFile file = await ImagePicker.PickSingleFileAsync(); 
    if (file != null) 
    { 
     IRandomAccessStream imageStream = await file.OpenAsync(FileAccessMode.Read); 
     var bmpImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage(); 
     bmpImage.DecodePixelHeight = 150; 
     bmpImage.DecodePixelWidth = 310; 
     bmpImage.SetSource(imageStream); 
     ImagePreview.Source = bmpImage; 
    } 
    return file; 
} 

//// 

private async void CreateButton_Click(object sender, RoutedEventArgs e) 
{ 
    ... 
    string DateTimeNow = DateTime.Now.ToString("HHmmssddMMyyyy"); 
    StorageFolder docs = KnownFolders.DocumentsLibrary; 
    StorageFolder myDir = await docs.CreateFolderAsync("My Dir", Windows.Storage.CreationCollisionOption.OpenIfExists); 
    StorageFolder DateTimeFolder = await myDir.CreateFolderAsync(DateTimeNow); 
    //StorageFile image = await PickImage(); 
    StorageFile copyImage = await PickImage().CopyAsync(DateTimeFolder, "image", NameCollisionOption.ReplaceExisting); 
    ... 
} 

但最后一行给我一个错误:

'System.Threading.Tasks.Task' does not contain a definition for 'CopyAsync' and no extension method 'CopyAsync' accepting a first argument of type 'System.Threading.Tasks.Task' could be found (are you missing a using directive or an assembly reference?)

+0

'PickImage'是'void',它不应该。 –

回答

2

您需要请在课程中设置一个字段或返回StorageFile。我建议更改PickImage()以返回StorageFile,这样您的代码会变成这样;

public async StorageFile PickImage() 
{ 
    FileOpenPicker ImagePicker = new FileOpenPicker(); 
    ... 
    return await ImagePicker.PickSingleFileAsync(); // 
    ... 
} 


private async void CreateButton_Click(object sender, RoutedEventArgs e) 
{ 
    StorageFile pickedFile = await PickImage(); 
    StorageFile copyImage = await file.CopyAsync(DateTimeFolder, "image", NameCollisionOption.ReplaceExisting); 
    ... 
} 

或者这样的事情。我对你的CreateButton_Click方法中的第二行有些困惑,因为我以为你想对PickImage的文件进行操作,而不是创建一个新文件。如果你想StorageFile坚持只是使它在表单类中的字段,并将其设置在PickImage

+1

我想你需要在第一种方法中返回'Task '。 –

+0

@chuex是的,我不知道。我希望解释是足够的。该代码太模糊,以至于我只能提供一个可行的解决方案。 – evanmcdonnal

+0

@evanmcdonnal对不起,我一直忙于一些个人事务,这只是我不得不放下一段时间的一个副项目。不过,我仍然无法运作。 我要用更完整的代码编辑我的问题。 – gabrieljcs

1

正如在评论中指出安德烈,你PickImage应返回的文件,这样你就可以做到以下几点:

public async StorageFile PickImage() 
{ 
    FileOpenPicker ImagePicker = new FileOpenPicker(); 
    ... 
    StorageFile file = await ImagePicker.PickSingleFileAsync(); // 
    ... 
    return file; 
} 

private async void CreateButton_Click(object sender, RoutedEventArgs e) 
{ 
    ... 
    StorageFile copyImage = await this.PickImage().CopyAsync(DateTimeFolder, "image", NameCollisionOption.ReplaceExisting); 
    ... 
} 
+0

或者如evanmcdonnal = P回答 – cassiorgr

0

根据两种方法的位置,有两种解决方案:

  • 如果方法位于同一类的文件,你可以声明StorageFile file在类文件中的局部变量。通过这种方式,您可以从CreateButton_click函数

  • 如果涉及到跨线程(方法在单独的线程中工作),则需要使用委托并调用它们。通过示例可获得详细信息here