web-dev-qa-db-ja.com

XAMLから埋め込みリソースを参照する方法は?

私はexeに埋め込みたいいくつかの画像を持っています。

Build ActionEmbedded Resourceに設定すると、リソースが利用できないというエラーをコーディングし、ビルドアクションをResourceに設定するように求めます

私はいくつかの異なる方法を試しました:

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

だから、私は何が間違っていますか?

24
eric.itzhak

BuildActionResourceに設定すると、アセンブリの埋め込みリソースとして使用されます。または、BuildActionContentに設定すると、結果の.xapファイルにバンドルされます。これらのBuildActionsのいずれかを使用できます。 BuildActionContentに設定すると、次のようなImageにアクセスできます:"/Resources/Images/darkaurora.png"(スラッシュで始まる必要があります)。 BuildAction Resourceを使用すると、"/YearBook;component/Resources/Images/darkaurora.png"(assemblyname; component/relativepath)としてイメージにアクセスできます。これが役立つことを願っています。

23
yo chauhan

ビルドアクションを埋め込みリソースではなくリソースに設定します

3
devdigital

ImageSource はインスタンス化できません。

public abstract class ImageSource : Animatable, 
IFormattable

あなたの一日を台無しにするその小さなabstractがそこにあります。実際にxamlはImageSourceのインスタンスをインスタンス化し、文字列を変換するために配置できるコンバーターを使用して、ContentPropertyAttribute(??)でマークされたプロパティに要素(この場合はUri)内の値を割り当てようとしています。オブジェクト(再び、??)。

BitmapSource が必要だと思います。

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

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