Невозможно отобразить изображение с съемного SD - UWP Windows IOT - PullRequest
0 голосов
/ 02 февраля 2019

Я сделал все, что нужно для получения доступа к файлам, расположенным на SD-карте моего устройства IOT (DragonBoard 410c).

У меня есть все ассоциации FileTypeAssociations

    <Capability Name="internetClient" />
    <Capability Name="privateNetworkClientServer" />
    <Capability Name="internetClientServer" />
    <uap:Capability Name="userAccountInformation" />
    <uap:Capability Name="removableStorage" />
    <uap:Capability Name="enterpriseAuthentication" />

Я МОГУ видеть и перебирать файлы на SD-карте

StorageFolder removablelDevices = Windows.Storage.KnownFolders.RemovableDevices;
StorageFolder sdCard = (await removablelDevices.GetFoldersAsync()).FirstOrDefault();
var files = await nm.GetFilesAsync();

foreach (var file in files)
{
    DebugText(file.Path);
    //E:\Photo1.jpg
    //E:\Photo2.jpg
}

Я устанавливаю ImageSource из ImageBrush фона для этих изображений в слайд-шоу.

private ImageSource _CurrentPicture;
public ImageSource CurrentPicture { get { return _CurrentPicture; } set { Set(ref _CurrentPicture, value); } }

<ImageBrush  Stretch="UniformToFill" ImageSource="{x:Bind ViewModel.CurrentPicture, Mode=OneWay}"/>

Изображения не отображаются (E: \ Photo1.jpg и т. Д.)

Я могу перебирать файловые ресурсы на локальном сервере в режиме разработки, поэтому в этом сценарии мои фотографии отображаются на моем фоне.


Я обновляю фон с помощью DispatchTimer.
Теперь, когда доступ к файлам асинхронный, я столкнулся с асинхронным адом.

public void TimerSetup()
{
    SlideShowTimer = new DispatcherTimer();
    SlideShowTimer.Tick += SlideShowTimer_Tick;
    SlideShowTimer.Interval = new TimeSpan(0, 0, SlideShowChangeIntervalSeconds);
    SlideShowTimer.Start();

}
void SlideShowTimer_Tick(object sender, object e)
{
    ChangeBackground();
}
public async Task ChangeBackground()
{
    var nextIndex = RandomGenerator.Next(0, SlideShowFiles.Length);
    var fileName = SlideShowFiles[nextIndex];
    var file = await StorageFile.GetFileFromPathAsync(fileName);
    var stream = await file.OpenAsync(FileAccessMode.Read);
    await CurPicImage.SetSourceAsync(stream);
    await Task.CompletedTask;
}

1 Ответ

0 голосов
/ 03 февраля 2019

Свойство ImageSource в ImageBrush не выполняет автоматическое преобразование путей к файлу в объект ImageSource.Вам нужно будет выполнить преобразование в вашем коде:

var file = await StorageFile.GetFileFromPathAsync(@"E:\Photo1.jpg");
var stream = await file.OpenAsync(FileAccessMode.Read);
var bitmapImage = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
imageBrush.ImageSource = bitmapImage;
await bitmapImage.SetSourceAsync(stream);

Выше приведен простой (быстрый и грязный) способ установки кисти изображения из пути к файлу в коде.Более элегантный способ - реализовать IValueConverter, который будет использоваться в привязке данных.Поскольку вы хотите, чтобы привязка данных была асинхронной, а не блокировала поток пользовательского интерфейса, требуется немного больше кодирования.Подробности того, как реализовать асинхронный IValueConverter, можно найти в этом отличном ответе: Асинхронная реализация IValueConverter

...