C# 从另一个方法调用文件

C# 从另一个方法调用文件,c#,xaml,windows-store-apps,async-await,storagefile,C#,Xaml,Windows Store Apps,Async Await,Storagefile,这里是新手问题。我有一个文件选择器: public async void PickImage() { FileOpenPicker ImagePicker = new FileOpenPicker(); ... StorageFile file = await ImagePicker.PickSingleFileAsync(); // ... } 我想在另一种方法中使用这个图像选择器设置的文件。大概是这样的: private async void Create

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

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);
    ...
}
公共异步任务PickImage()
{
FileOpenPicker ImagePicker=新的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();
如果(文件!=null)
{
irandomaccesstream 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=bmp图像;
}
返回文件;
}
////
私有异步void CreateButton_单击(对象发送方,路由目标)
{
...
字符串DateTimeNow=DateTime.Now.ToString(“hhmmsddmmyyyy”);
StorageFolder docs=KnownFolders.DocumentsLibrary;
StorageFolder myDir=await docs.CreateFolderAsync(“My Dir”,Windows.Storage.CreationCollisionOption.OpenIfExists);
StorageFolder DateTimeFolder=等待myDir.CreateFolderAsync(DateTimeNow);
//StorageFile image=等待PickImage();
StorageFile copyImage=await PickImage().CopyAsync(DateTimeFolder,“image”,NameCollisionOption.ReplaceExisting);
...
}
但最后一行给了我一个错误:

“System.Threading.Tasks.Task”不包含“CopySync”的定义,并且找不到接受类型为“System.Threading.Tasks.Task”的第一个参数的扩展方法“CopySync”(是否缺少using指令或程序集引用?)


您需要在类中设置字段或返回
存储文件
。我建议更改
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\u Click
方法中的第二行有点困惑,因为我以为您想从
PickImage
对文件进行操作,但是您正在创建一个新文件。如果希望
StorageFile
持久化,只需将其设置为表单类中的一个字段,并在
PickImage
中进行设置,您需要在类中设置一个字段或返回
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\u Click
方法中的第二行有点困惑,因为我以为您想从
PickImage
对文件进行操作,但是您正在创建一个新文件。如果希望
StorageFile
持久化,只需将其作为表单类中的一个字段,并按照Andre在注释中指出的那样在
PickImage
中进行设置,您的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);
    ...
}

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

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

  • 如果这些方法位于同一类文件中,则可以在类文件中将
    StorageFile
    声明为局部变量。通过这种方式,您可以通过
    CreateButton\u单击
    功能访问它

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


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

  • 如果这些方法位于同一类文件中,则可以在类文件中将
    StorageFile
    声明为局部变量。通过这种方式,您可以通过
    CreateButton\u单击
    功能访问它

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


PickImage
void
,它不应该是空的。
PickImage
void
,它不应该是空的。@chuex是的,我不知道。我希望这个解释是足够的。代码太模糊,我无法给出一个有效的解决方案。@evanmcdonnal很抱歉耽搁了,我一直忙于一些个人事务,这只是我不得不暂时搁置的一个次要项目。不过,我还是不能让它工作。我将用更完整的代码编辑我的问题。我认为您需要在第一个方法中返回
Task
。@chuex是的,我不知道。我希望这个解释是足够的。代码太模糊,我无法给出一个有效的解决方案。@evanmcdonnal很抱歉耽搁了,我一直忙于一些个人事务,这只是我不得不暂时搁置的一个次要项目。不过,我还是不能让它工作。我将用更完整的代码编辑我的问题。