#c# #uwp
#c# #uwp
Вопрос:
Сейчас я работаю над операцией редактирования в своем приложении. Таким образом, в операции редактирования есть возможность изменить изображение, и в то же время имя файла, в котором хранится изображение контакта, не может быть переименовано (в течение одного сеанса работы файлы изображений будут меняться, но все эти файлы будут иметь одно и то же имя).
И я использовал метод перегрузки CopyAsync
(документы к этому методу здесь), который, как я понимаю, должен заменить файл на существующий файл с тем же именем.
Я получаю imageFile
переменную по FileOpenPicker
. Приведенный ниже код выполняется каждый раз, когда я выбираю изображение с помощью FileOpenPicker
. И когда я повторно выбираю изображение в результате Image
, элемент управления пользовательского интерфейса показывает мне предыдущее выбранное изображение. Я ожидаю, что Image
будет просмотр последнего выбранного мной изображения, но этого не произошло.
public BitmapImage Image { set; get; }
//Copy of the file that saved in temporary storage
StorageFile fileForView = await imageFile.CopyAsync
(ApplicationData.Current.TemporaryFolder,
fileName,
NameCollisionOption.ReplaceExisting);
Image = new BitmapImage(new Uri(fileForView.Path));
Возможно, я неправильно понимаю логику CopyAsync
метода, если я в этом случае, пожалуйста, покажите мне, как заставить мой план работать с этим методом, если это возможно. В противном случае предложите свое решение, потому что я понятия не имею, как это сделать.
Также я пытался сделать это с помощью CopyAndReplaceAsync
метода. Но все еще нет результата. Я делаю это таким образом:
if (null != await ApplicationData.Current.TemporaryFolder.TryGetItemAsync(fileName))
{
StorageFile storageFile = await ApplicationData.Current.TemporaryFolder.GetFileAsync(fileName);
await storageFile.CopyAndReplaceAsync(imageFile);
}
Комментарии:
1. Вы уверены, что он не переопределяется? Я думаю, что, возможно, вы неправильно открываете файл повторно. Можете ли вы показать свой код для загрузки изображения?
2. Вы имеете в виду, что может быть проблема в том, что изображение не было заменено? Я думал, что файл, который
CopyAsync
возвращает, не нуждается ни в какой операции приложения, чтобы сделать его работоспособным.Image = new BitmapImage(new Uri(fileForView.Path));
3. Вы вообще меняете изображение перед его сохранением или просто повторно сохраняете то же изображение? Вы всегда могли бы сделать
File.Delete(storageFile)
, если бы хотели попробовать, но мне кажется, что он перезаписывает его — это просто тот же образ.4. Да, я повторно сохраняю изображение. Я попробовал ваш метод. И для большей уверенности после удаления я проверил временную папку, и в ней не сохранилось ни одного файла. Поэтому, даже если я копирую новый файл во временную папку, он все равно показывает мне предыдущий. Также я использовал
DeleteAsync
методStorageFile
класса. И все еще никакого результата.
Ответ №1:
Я ожидаю, что изображение будет просматривать последнее выбранное мной изображение, но этого не произошло.
Приведенный выше CopyAsync
метод верен, и я протестировал его со следующим кодом, он работает хорошо.
private async void ListOption_ItemClick(object sender, ItemClickEventArgs e)
{
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.ViewMode = PickerViewMode.Thumbnail;
openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
openPicker.FileTypeFilter.Add(".jpg");
openPicker.FileTypeFilter.Add(".jpeg");
openPicker.FileTypeFilter.Add(".png");
StorageFile file = await openPicker.PickSingleFileAsync();
if (file != null)
{
StorageFile fileForView = await file.CopyAsync(ApplicationData.Current.TemporaryFolder, file.Name, NameCollisionOption.ReplaceExisting);
Image = new BitmapImage(new Uri(fileForView.Path));
TestImg.Source = Image;
}
else
{
}
}