2013-05-28 140 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