web-dev-qa-db-de.com

Wie verweise ich auf eingebettete Ressourcen von XAML?

Ich habe mehrere Bilder, die ich ins Exe einbetten möchte.

Wenn ich die Build Action auf Embedded Resource .__ setze, erhalte ich durch den Code einen Fehler, dass die Ressource nicht verfügbar ist und bittet mich, die Build Action auf Resource zu setzen.

Ich habe verschiedene Methoden ausprobiert:

 <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>

Dieser Code befindet sich in einer Ressourcendatei . Aber keiner hat funktioniert, sie alle geben diesen Fehler aus:

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.

Und an verschiedenen Stellen im Code bekomme ich:

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'

Also, was mache ich falsch?

23
eric.itzhak

Wenn Sie BuildAction auf Resource setzen, wird sie als eingebettete Ressource in eine Assembly eingefügt. Oder Sie können BuildAction auf Content setzen und dann in der resultierenden .xap-Datei gebündelt werden. Durch Setzen von BuildAction auf Content können Sie auf Image wie folgt zugreifen: "/Resources/Images/darkaurora.png" (muss mit einem Schrägstrich beginnen). Wenn Sie die BuildAction-Ressource verwenden, können Sie als "/YearBook;component/Resources/Images/darkaurora.png" (Assemblyname; Komponente/Relativpfad) auf das Bild zugreifen. Hoffe das wird helfen.

24
ethicallogics

Legen Sie die Erstellungsaktion auf Ressource, nicht eingebettete Ressource fest 

2
devdigital

ImageSource kann nicht instanziiert werden. 

public abstract class ImageSource : Animatable, 
IFormattable

Dort ist der kleine abstract, der den Tag verunsichern wird. Ihr xaml versucht tatsächlich, eine Instanz von ImageSource zu instanziieren, und weist dann den Wert innerhalb des Elements (in diesem Fall Ihr Uri) einer mit ContentPropertyAttribute (??) markierten Eigenschaft zu, wobei der Konverter verwendet wird, in den der String konvertiert werden kann ein Objekt (wieder ??).

Ich denke, Sie wollen eine BitmapSource

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

Nur für diejenigen, die Xamarin-Formulare verwenden und sich mit dieser Frage befassen, können Sie eine benutzerdefinierte XAML-Markuperweiterung erstellen, die hier erläutert wird:

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

im Abschnitt "Embedded Images" -> "Using XAML"

Angabe der benutzerdefinierten Erweiterung

[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;
 }
}

zitieren, wie man verwendet

<?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>
0
t.shikanai