2017-01-15 23 views
0

我有基于PCL的Xamarin解决方案。我需要做的是在应用程序项目中将图像加载到视图中。这些图像在另一个PCL项目中。如何从特定位置加载图像,而不是从相关程序集加载?

基本上我有一些GridView的xamarin视图。该视图应显示“卡片”之类的内容。所有数据加载良好,但图像。老实说,我尝试了一切,我可以emagine - 绝对路径,嵌入式资源,相对路径,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; 
    } 

所以,你可以用同样的方法通过加载<Application.Resources>就像代码来创建你的DataTemplate背后。

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

如果它不起作用。请尝试我的demo

+0

谢谢!这是优秀和完整的指导如何使用嵌入图像。我其实并没有期待这个详尽的东西,但非常感谢! – Qerts