【问题标题】:Call file from another method从另一个方法调用文件
【发布时间】:2013-05-28 16:53:08
【问题描述】:

这里是新手问题。我有这个文件选择器:

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”不包含“CopyAsync”的定义,并且找不到接受“System.Threading.Tasks.Task”类型的第一个参数的扩展方法“CopyAsync”(您是否缺少using 指令还是程序集引用?)

【问题讨论】:

  • PickImagevoid,它不应该。

标签: c# xaml windows-store-apps async-await storagefile


【解决方案1】:

您需要在类中设置一个字段或返回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

【讨论】:

  • 我认为你需要在第一种方法中返回Task&lt;StorageFile&gt;
  • @chuex 是的,我不知道。我希望解释是足够的。代码太模糊,我无法给出一个可行的解决方案。
  • @evanmcdonnal 抱歉耽搁了,我一直忙于一些私人事务,这只是我不得不搁置一段时间的副业。不过,我仍然无法让它工作。我将用更完整的代码编辑我的问题。
【解决方案2】:

正如 Andre 在 cmets 中指出的,您的 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);
    ...
}

【讨论】:

  • 或者由 evanmcdonnal =P 回答
【解决方案3】:

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

  • 如果方法位于同一个类文件中,可以在类文件中将StorageFile file声明为局部变量。这样,您就可以从CreateButton_click 函数中访问它

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多