gpt4 book ai didi

c# - UWP 使用 DataTemplate 在 GridView 中显示图像

转载 作者:行者123 更新时间:2023-12-03 08:07:17 34 4
gpt4 key购买 nike

上下文

我正在尝试将用户本 map 片文件夹内的目录(例如 C:\Users\Username\Pictures\The Folder)中的图像显示到 GridView 中。

我正在使用图像类(这是 GridView 的源):

public class SpotlightImage
{
public string ID { get; set; }

public string Name { get; set; }

public string FileSource { get; set; }
}

GridView 的 XAML 如下:

<GridView
Padding="{StaticResource MediumLeftRightMargin}"
animations:Connected.ListItemElementName="thumbnailImage"
animations:Connected.ListItemKey="galleryAnimationKey"
IsItemClickEnabled="True"
ItemClick="ImagesGridView_ItemClick"
ItemsSource="{x:Bind Source, Mode=OneWay}"
RightTapped="ImagesGridView_RightTapped"
SelectionMode="None">
<GridView.ItemTemplate>
<DataTemplate x:DataType="models:SpotlightImage">
<Image
x:Name="thumbnailImage"
AutomationProperties.Name="{x:Bind Name}"
Source="{x:Bind FileSource}"
Style="{StaticResource ThumbnailImageStyle}"
ToolTipService.ToolTip="{x:Bind Name}" />
</DataTemplate>
</GridView.ItemTemplate>
</GridView>

用于填充源代码的 C# 如下(我意识到很可能没有必要使用并行 foreach,但是,我使用它是为了与项目中的其他代码保持一致):

private async void ImagesPage_OnLoaded(object sender, RoutedEventArgs e)
{
Source.Clear();

storageFiles = new List<Windows.Storage.StorageFile>();

List<string> SavedWallpapers = await RetrieveAllSavedWallpapers.Main(); //Retrieves image names

galleryData = new List<SpotlightImage>();

Parallel.ForEach(SavedWallpapers, spotlightFile =>
{
imgFileFunction(spotlightFile);
});

async void imgFileFunction(string spotlightFile)
{
try
{
//StorageReferences.WallpaperSaveStorage is a StorageFolder variable for the images directory being accessed
Windows.Storage.StorageFile file = await StorageReferences.WallpaperSaveStorage.GetFileAsync(spotlightFile);

storageFiles.Add(file);

var img = new SpotlightImage()
{
ID = file.DisplayName,
FileSource = file.Path,
Name = file.DisplayName
};

galleryData.Add(img);

await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
Source.Add(img);

Debug.WriteLine("IMAGE ADDED: " + img.Name);
}
);
}
catch (Exception ex)
{
Debug.WriteLine("MULTITHREADED ERROR: " + ex.Message);
}
}
}

问题

GridView 显示空方 block 而不是图像。显示了正确数量的“图像”,但它们是空白的。

我尝试过的

我在 StackOverflow 上查看了类似的问题并尝试了以下操作:

  1. 使用 UriSource 而不是源(同样的问题仍然存在)
  2. 查看了代码(我在项目的其他地方使用了完全相同的代码,并且它可以在那里工作。唯一的区别是访问的是不同的文件夹)
  3. 检查权限(我在之前的代码中使用了这个确切的目录,没有问题)

注释:

我的 UWP 应用程序已经具有 BroadFileSystemAccess(这对于我的应用程序的目的来说是必要的)。

我有一个 FlipView,它正在访问相同的文件并遇到完全相同的问题。

我已经在项目的其他地方有完全相同的代码运行得很好,唯一的区别是正在访问的文件夹。这让我相信问题出在权限上,但我的应用程序具有 BroadFileSystemAccess。所以这不应该是问题(?)

正如您可能知道的那样,我对 UWP 还比较陌生。因此,如果存在一些明显的权限问题或类似问题,请对我宽容一点:)

最佳答案

基于Image.Source property ,在文档的在 XAML 中设置源部分中,它提到当您将Source 属性值设置为描述源图像文件位置的 URI 字符串时实际上,它调用与 BitmapImage(Uri) 构造函数等效的函数来为 Image.Source 属性 创建一个 BitmapImage 对象。

我做了一个简单的测试,直接从文件路径(应用程序外的文件)创建一个 BitmapImage 对象。如果将 BitmapImage 对象设置为图像控件,则它不会显示任何内容。这与您得到的行为相同。如果这些文件是应用程序包的一部分,则它可以正常工作。

正如您提到的,您正在使用完整文件系统访问,我想这意味着broadFileSystemAccess 功能,对吧?此功能仅适用于Windows.Storage namespace中的API不适用于像 BitmapImage(URI) 这样的 API。

因此,该行为的原因应该是,当应用使用不属于应用程序包的文件路径作为 BitmapImage 对象的 URI 时,BitmapImage 对象未正确创建。尝试以 steam 方式打开文件并将其设置为 BitmapImage 对象是打开位于应用程序包之外的图像文件的正确方法。

关于c# - UWP 使用 DataTemplate 在 GridView 中显示图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71813940/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com