从另一个方法调用的文件 [英] Call file from another method
问题描述
在这里新手问题。我有这个文件选择器:
公共异步无效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 changingPickImage()
to return theStorageFile
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 fromPickImage
but instead you're creating a new file. If you want theStorageFile
to persist just make it a field on the form class and set it inPickImage
这篇关于从另一个方法调用的文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!