无法显示可移动 SD 中的图像 - UWP Windows IOT
Can't display image from Removeable SD - UWP Windows IOT
我已经完成了所有必要的事情来访问我的 IOT 设备 (DragonBoard 410c) 的 SD 卡上的文件。
我有所有的 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
}
我正在将背景的 ImageBrush 的 ImageSource 设置为幻灯片中的这些图片。
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;
}
ImageBrush 上的 ImageSource 属性 不会自动将文件路径转换为 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。由于您希望数据绑定是异步的并且不阻塞 UI 线程,因此需要更多的编码。有关如何实现异步 IValueConverter 的详细信息,请参见这个出色的答案:Async Implementation of IValueConverter
我已经完成了所有必要的事情来访问我的 IOT 设备 (DragonBoard 410c) 的 SD 卡上的文件。
我有所有的 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
}
我正在将背景的 ImageBrush 的 ImageSource 设置为幻灯片中的这些图片。
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;
}
ImageBrush 上的 ImageSource 属性 不会自动将文件路径转换为 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。由于您希望数据绑定是异步的并且不阻塞 UI 线程,因此需要更多的编码。有关如何实现异步 IValueConverter 的详细信息,请参见这个出色的答案:Async Implementation of IValueConverter