it-swarm.com.ru

Динамическое связывание источника изображения на формах xamarin

мой вопрос, могу ли я привязать строковое изображение к источнику изображения? У меня есть несколько изображений, и изображение будет меняться, если условие. Так:

Xaml на формах Xamarin: 

<Image Source="{Binding someImage}" Aspect="Fill" Grid.Row="2"></Image>

Codebehind C #

   public String someImage;
    public String SomeImage
    {
        set
        {
            if (someImage != value)
            {
                someImage = value;                                        
            }
        }
        get
        {
            return someImage;
        }
    }

InitializeComponent часть:

if(true)
            {
                someImage = "backgroundListViewGren.png";
            }
            else
            {
                someImage = "backgroundListViewRed.png";
            }

изображение находится в папке «Изображения» на переносном проекте

но это, не работает, может быть, я что-то обидеть, но я не понимаю . какие-либо решения?

Я пытался с ImageSource, а не строки, но тоже не работает.

11
Mr. Developer

Я опубликую этот ответ здесь, потому что это тот, который я искал, и я подозреваю, что большинство других (и в настоящее время Google направляет вас сюда, что в настоящее время не очень полезно).

Как связать изображение с помощью XAML:

XAML:

<Image>
    <Image.Source>
        <FileImageSource File="{Binding SomeImage}" />
    </Image.Source>
</Image>

Затем в ViewModel, C #:

public string SomeImage
{
    get { return string.Format("prefix-{0}-suffix.png", OtherProperty); }
}

Более новый, лучший, но по сути эквивалентный c #, который вы можете использовать вместо вышеупомянутого:

public string SomeImage => $"prefix-{OtherProperty}-suffix.png";

Это, безусловно, самый простой способ настроить его, ИМО :).

Правка: Это должно быть само собой разумеется, но изображение, очевидно, должно быть в папке Resources проекта для каждой платформы.

12
Maverick

Вы сказали:

изображение находится в папке «Изображения» на переносном проекте

У каждой платформы свой подход к ресурсам и изображениям. Xamarin обрабатывает это, например, в каждой платформе Xamarin.iOS имеет встроенный ресурс, а Xamarin.Android использует ресурс Android для изображений.

Вы должны размещать свои изображения в каждом проекте для Xamarin.Forms, чтобы знать, где их искать на каждой платформе.

Для получения дополнительной информации посмотрите на это .

3
Emad

Для использования изображений из PCL, ознакомьтесь с этой частью в документации Xamarin .

Вы должны убедиться, что Build action для каждого изображения установлено в Embedded Resource.

Затем, если вы хотите использовать их в XAML, укажите MarkupExtension

[ContentProperty ("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);

    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>

Как упоминалось в комментариях, если вы хотите, чтобы это работало «из коробки», поместите их в папку «Ресурсы» вашего проекта соответствующей платформы. Таким образом, вы также можете использовать имеющиеся механизмы автоматического определения размера. Чтобы узнать больше об этом методе, смотрите эту страницу .

Добавив их с правильным соглашением об именах в нужную папку, вы можете просто обратиться к имени файла, и Xamarin.Forms переведет его в правильный формат для платформы.

3
Gerald Versluis

Вы можете сделать это немного проще, я думаю. Это работает на моем . Поместите изображение в соответствующее место на каждой платформе, например Ресурсы/рисовать на Android

В твоем Xaml:

<Image Source="{Binding someImage}" Aspect="Fill" Grid.Row="2"></Image>

В вашей модели просмотра:

private string _someImage = "icon_eye_hidden";
    public string someImage
    {

        get => this._someImage;
        set
        {

            if (this._someImage == value) return;

            this._someImage = value;
            this.RaisePropertyChanged(() => this.someImage);
        }
    }

Затем просто установите someImage к имени изображения (без расширения), и оно должно обновиться.

0
George McKibbin