从另一个方法调用的文件 [英] Call file from another method

查看:137
本文介绍了从另一个方法调用的文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 公共异步无效PickImage()
{
    FileOpenPicker ImagePicker =新FileOpenPicker();
    ...
    StorageFile文件=等待ImagePicker.PickSingleFileAsync(); //
    ...
}

和我想用在另一种方法这个图像选择器设置文件。事情是这样的:

 专用异步无效CreateButton_Click(对象发件人,RoutedEventArgs E)
{
    ......一个从PickImage()
                                    v
    StorageFile copyImage =等待file.CopyAsync(DateTimeFolder,形象,NameCollisionOption.ReplaceExisting);
    ...
}

这显然不是这样工作。我该怎么办呢?


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

 公共异步任务< StorageFile> 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文件=等待ImagePicker.PickSingleFileAsync();
    如果(文件!= NULL)
    {
        IRandomAccessStream的ImageStream =等待file.OpenAsync(FileAccessMode.Read);
        VAR bmpImage =新Windows.UI.Xaml.Media.Imaging.BitmapImage();
        bmpImage.De codePixelHeight = 150;
        bmpImage.De codePixelWidth = 310;
        bmpImage.SetSource(的ImageStream);
        图片preview.Source = bmpImage;
    }
    返回文件;
}////私人异步无效CreateButton_Click(对象发件人,RoutedEventArgs E)
{
    ...
    串DateTimeNow = DateTime.Now.ToString(HHmmssddMMyyyy);
    StorageFolder文档= KnownFolders.DocumentsLibrary;
    StorageFolder MYDIR =等待docs.CreateFolderAsync(我的目录,Windows.Storage.CreationCollisionOption.OpenIfExists);
    StorageFolder DateTimeFolder =等待myDir.CreateFolderAsync(DateTimeNow);
    // StorageFile图像=等待PickImage();
    StorageFile copyImage =等待PickImage()CopyAsync(DateTimeFolder,形象,NameCollisionOption.ReplaceExisting)。
    ...
}

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


  

System.Threading.Tasks.Task'不包含'CopyAsync的定义,并没有扩展方法'CopyAsync接受型System.Threading.Tasks.Task'的第一个参数可以找到(是否缺少使用指令或程序集引用?)



解决方案

您需要或者设置字段类或退回 StorageFile 。我建议改变 PickImage()返回 StorageFile 所以你code将代替这个样子

 公共异步StorageFile PickImage()
{
    FileOpenPicker ImagePicker =新FileOpenPicker();
    ...
    返回等待ImagePicker.PickSingleFileAsync(); //
    ...
}
私人异步无效CreateButton_Click(对象发件人,RoutedEventArgs E)
{
    StorageFile pickedFile =等待PickImage();
    StorageFile copyImage =等待file.CopyAsync(DateTimeFolder,形象,NameCollisionOption.ReplaceExisting);
    ...
}

或者诸如此类的话。我稍微在你的 CreateButton_Click 方法,因为我想你想从文件进行操作 PickImage 而是要创建一个新的文件。如果你想在 StorageFile 坚持只是使它在表单类中的字段,并将其设置在 PickImage

Newbie question here. I have this file picker:

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

And I want to use the file set by this image picker in another method. Something like this:

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

It is obviously not working like this. How can I do it?


Ok, based on the answers I got, this is what I came up with:

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);
    ...
}

But the last line gives me an error:

'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?)

解决方案

You need to either set a field in the class or return the StorageFile. I would suggest changing PickImage() to return the StorageFile so you're code would instead look like this;

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);
    ...
}

Or something to that effect. I'm slightly confused by the second line in your CreateButton_Click method because I thought you wanted to operate on the file from PickImage but instead you're creating a new file. If you want the StorageFile to persist just make it a field on the form class and set it in PickImage

这篇关于从另一个方法调用的文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆