2017-01-15 10 views
0

У меня есть решение Xamarin на основе PCL. Что мне нужно сделать, так это загрузить изображения в представлении проектов приложений. Эти изображения находятся в другом проекте PCL.Как загружать изображения из определенного места, а не из связанных сборок?

В основном у меня есть вид GradView xamarin. В этом представлении должно отображаться нечто вроде «карт». Все данные загружаются хорошо, но изображения. Честно говоря, я пробовал все, что мог, - полный путь, встроенные ресурсы, относительный путь, префикс windows ms-appx ///. Я не пробовал только поток, который не очень полезен для меня. Работал только веб-источник.

Мой код:

[assembly: ExportRenderer(typeof(GridViewRoles), typeof(GridViewRolesRenderer))] 
namespace StrangerParty.Windows.Renderers 
{ 
    public class GridViewRolesRenderer : ViewRenderer<GridViewRoles, GridView> 
    { 
     private GridView gridView; 

     protected override void OnElementChanged(ElementChangedEventArgs<GridViewRoles> e) 
     { 
      base.OnElementChanged(e); 

      if (this.Control == null) 
      { 
       this.gridView = new GridView(); 

       StringBuilder sb = new StringBuilder(); 
       sb.Append("<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">"); 
       sb.Append("<Grid Height=\"100\" Width=\"100\" >"); /*Background =\"#FF2E2E2E\"*/ 
       sb.Append("<Image x:Name=\"ImageRoleImage\" Stretch=\"UniformToFill\" Source=\"sampleForTesting.png\"/>"); 
       sb.Append("</Grid>"); 
       sb.Append("</DataTemplate>"); 

       DataTemplate datatemplate = (DataTemplate)XamlReader.Load(sb.ToString()); 

       this.gridView.ItemTemplate = datatemplate; 

       SetNativeControl(this.gridView); 
      } 

      this.gridView.ItemsSource = Core.Instance.GameHandler.Game.Players; 
     } 
    }  
} 

Спасибо отношению к какой-либо помощи

ответ

1

Вы можете загрузить файл изображения из PCL с помощью Assembly.GetManifestResourceStream. В соответствии с вашим требованием вам необходимо использовать Converter, как и код позади.

Coverter

public object Convert(object value, Type targetType, object parameter, string language) 
{ 
    var temp = new BitmapImage(); 
    var assembly = typeof(ImageTest.App).GetTypeInfo().Assembly; 
    Stream stream = assembly.GetManifestResourceStream(value as string); 
    if (stream != null) 
    { 
     using (var memStream = new MemoryStream()) 
     { 
      stream.CopyTo(memStream); 
      memStream.Position = 0; 
      temp.SetSource(memStream.AsRandomAccessStream()); 
     } 
    } 
    return temp; 
} 

Следующим шагом является создание DataTemplate, чтобы использовать converter DataTemplate не может не быть загружен XamlLoader. Таким образом, вы можете создать <ResourceDictionary> для данных, подобных кодам ниже.

.... 
xmlns:local="using:ImageTest.UWP" 
    RequestedTheme="Light"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <DataTemplate x:Key="MyDataTemplate"> 
       <Grid > 
        <Grid.Resources> 
         <local:DateToStringConverter x:Key="MyConvert"/> 
        </Grid.Resources> 
        <Image Name="MyImage" Source="{Binding imageSource , Mode=OneWay, Converter={StaticResource MyConvert}}" /> 
       </Grid> 
      </DataTemplate> 
     </ResourceDictionary> 
    </Application.Resources> 

MainPage.xaml

<GridView Name="MyGridView" ItemTemplate="{StaticResource MyDataTemplate}"/> 

MainPage.xaml.cs

public MainViewModel viewModel { get; set; } 
    public MainPage() 
    { 
     this.InitializeComponent();  
     viewModel = this.DataContext as MainViewModel; 
     viewModel.items.Add(new Model() { imageSource = "ImageTest.hello.jpg" }); 
     viewModel.items.Add(new Model() { imageSource= "ImageTest.hello.jpg" }); 
      MyGridView.ItemsSource = viewModel.items; 
    } 

Таким образом, вы можете использовать один и тот же способ создать свой DataTemplate загрузив <Application.Resources> так же, как код за.

var ItemTemplate = App.Current.Resources["MyDataTemplate"] as Windows.UI.Xaml.DataTemplate 

Если это не поможет. Пожалуйста, попробуйте мой demo.

+0

спасибо! Это отличное и полное руководство по использованию встроенных образов. Я действительно не ожидал чего-то такого исчерпывающего, но это очень ценится! – Qerts

 Смежные вопросы

  • Нет связанных вопросов^_^