#.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
Свойство для anImage
являетсяImageSource
( github.com/unoplatform/uno/blob /… ) и это тот, кто отвечает за «загрузку» файла. Фактическая реализация варьируется в зависимости от платформы.3. Этот (контент-подход) работает, за исключением того, что вам нужно явно ввести результат из GetFile … как StorageFile .