Как обратиться к встроенным ресурсам из XAML?

У меня есть несколько изображений, которые я хочу встроить в exe.

Когда я устанавливаю Строить действие на Встроенный ресурс Я получаю код ошибки, что ресурс недоступен, и попросил меня установить действие сборки Ресурс

Я пробовал несколько разных методов:

 <ImageSource x:Key="Image_Background">YearBook;component/Resources/Images/darkaurora.png</ImageSource>

 <ImageSource x:Key="Image_Background">Images/darkaurora.png</ImageSource>

 <ImageSource x:Key="Image_Background">pack://application:,,,/Resources/Images/darkaurora.png</ImageSource>

Этот код находится в файле ресурсов. Но никто не работал, все они бросают эту ошибку:

Cannot convert the string 'pack://application:,,,/Resources/Images/darkaurora.png' into a 'System.Windows.Media.ImageSource' object. Cannot locate resource 'resources/images/darkaurora.png'.  Error at object 'Image_Background' in markup file 'YearBook;component/Resources/ImageResources.xaml' Line 4 Position 6.

И в разных местах кода я получаю:

the file 'YearBook;component/Resources/Images/shadowdrop.png' is not a part of the project or its 'Build Action' property is not set to 'Resource'

Итак, что я делаю неправильно?

Ответ 1

Когда вы устанавливаете BuildAction на Resource, он становится встроенным ресурсом в сборке. Или вы можете установить BuildAction на Content, после чего он будет объединен в результирующий файл .xap. Вы можете использовать любой из этих BuildActions. Установив BuildAction для Content, вы можете получить доступ к изображению, например: "/Resources/Images/darkaurora.png" (должно начинаться с косой черты). А когда вы используете ресурс BuildAction, вы можете получить доступ к изображению как "/YearBook;component/Resources/Images/darkaurora.png" (имя сборки; компонент/относительный "/YearBook;component/Resources/Images/darkaurora.png"). Надеюсь, это поможет.

Ответ 2

Установите действие сборки для ресурса, а не для встроенного ресурса

Ответ 3

ImageSource не может быть создан.

public abstract class ImageSource : Animatable, 
IFormattable

Там, что немного abstract, в котором будет зависнуть ваш день. Ваш xaml на самом деле пытается создать экземпляр ImageSource, а затем назначить значение внутри элемента (ваш Uri в этом случае) для свойства, помеченного ContentPropertyAttribute (??), используя любой конвертер, который может быть расположен для преобразования строки в объект (опять же?).

Я думаю, вы хотите BitmapSource.

<BitmapImage 
    x:Key="Image_Background" 
    UriSource="/Images/darkaurora.png" />

Ответ 4

Только для тех, кто использует формы xamarin и сталкивается с этим вопросом, это может быть сделано путем создания собственного расширения разметки xaml, объясненного здесь:

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/images?tabs=windows

в разделе "Встроенные изображения" → "Использование XAML"

Цитирование пользовательских расширений

[ContentProperty (nameof(Source))]
public class ImageResourceExtension : IMarkupExtension
{
 public string Source { get; set; }

 public object ProvideValue (IServiceProvider serviceProvider)
 {
   if (Source == null)
   {
     return null;
   }

   // Do your translation lookup here, using whatever method you require
   var imageSource = ImageSource.FromResource(Source, typeof(ImageResourceExtension).GetTypeInfo().Assembly);

   return imageSource;
 }
}

цитата о том, как использовать

<?xml version="1.0" encoding="UTF-8" ?>
<ContentPage
   xmlns="http://xamarin.com/schemas/2014/forms"
   xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
   xmlns:local="clr-namespace:WorkingWithImages;assembly=WorkingWithImages"
   x:Class="WorkingWithImages.EmbeddedImagesXaml">
 <StackLayout VerticalOptions="Center" HorizontalOptions="Center">
   <!-- use a custom Markup Extension -->
   <Image Source="{local:ImageResource WorkingWithImages.beach.jpg}" />
 </StackLayout>
</ContentPage>