платформа uno: GetManifestResourceNames ничего не возвращает

#.net-assembly #embedded-resource #uno-platform

#.net-сборка #встроенный ресурс #uno-платформа

Вопрос:

Для платформы Uno мне нужно загрузить изображение из ресурсов «содержимого». Я использую GetManifestResourceStream , но он возвращает null при запуске проекта UWP (я не пробовал другие варианты).

Чтобы копнуть немного дальше, я добавил GetManifestResourceNames , но он также возвращает пустой массив.

Вот мой код, который находится внутри UserControl ( Source является свойством):

 private void LoadBmpSrc()
{
  if (Source == null)
    return;

  Assembly assembly = GetType().GetTypeInfo().Assembly;
  string[] names = assembly.GetManifestResourceNames();
  using (Stream stream = assembly.GetManifestResourceStream(Source))
  {
    bmpSrc = SKBitmap.Decode(stream);
  }
}
 

В использующем файле XAML у меня есть это, внутри Grid :

   <controls:ExpandableImage 
    Grid.Column="0"
    Source="ms-appx:///Assets/icons/folder_tab.png" 
    />
 

Если я поменяю местами этот код:

   <Image 
    Grid.Column="0" 
    Source="ms-appx:///Assets/icons/folder_tab.png" 
    />
 

отображается изображение.

Редактировать

Вот XAML для элемента управления:

 <UserControl
  x:Class="UnoTest.Shared.Controls.ExpandableImage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="using:UnoTest.Shared.Controls"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:skia="using:SkiaSharp.Views.UWP"
  >

  <skia:SKXamlCanvas x:Name="EICanvas" PaintSurface="OnPaintSurface" />
  
</UserControl>
 

Ответ №1:

Ваша проблема в основном в том, что Content изображения не обрабатываются как Resources .

Если вы хотите включить изображения в качестве ресурса, вам нужно будет изменить действие сборки этого файла на встроенный ресурс. Как только вы измените это, оно появится в

 string[] names = assembly.GetManifestResourceNames();
 

вызов метода.

Вы заметите, что имя изображения будет примерно таким ApplicationName.Directory.ImageName.png . Вам нужно будет указать это имя, чтобы загрузить изображение с

 assembly.GetManifestResourceStream(imageName)
 

Если вы хотите загрузить Image данные содержимого в поток, вы можете сделать это (не тестируя его) с помощью следующего кода:

 var imageUrl = "ms-appx:///Assets/SplashScreen.png";
var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(imageUrl));
        
using(var stream = await file.OpenStreamForReadAsync())
{
   //Use your data here
}
 

Надеюсь, это поможет.-

Комментарии:

1. Я попробую ваше предложение. Тогда знаете ли вы, как <Image /> загружает файлы, когда они помечены как «содержимое»? Я предполагаю, что ответ — это вторая половина вашего ответа.

2. Source Свойство для an Image является ImageSource ( github.com/unoplatform/uno/blob /… ) и это тот, кто отвечает за «загрузку» файла. Фактическая реализация варьируется в зависимости от платформы.

3. Этот (контент-подход) работает, за исключением того, что вам нужно явно ввести результат из GetFile … как StorageFile .