2016-09-21 15 views
2

個人的には、Xamarin.Forms.Mapコントロールのために、CustomPinという拡張子を作成する必要があります。 UWP部分(PCLプロジェクト)Xamarinフォーム - Image to/from IRandomAccessStreamReference

私はそれのようなMapIconを作成:

nativeMap.MapElements.Add(new MapIcon() 
{ 
    Title = pin.Name, 
    Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/Pin/customicon.png")), 
    Location = new Geopoint(new BasicGeoposition() { Latitude = pin.Position.Latitude, Longitude = pin.Position.Longitude }), 
    NormalizedAnchorPoint = new Windows.Foundation.Point(0.5, 1.0) 
}); 

しかし、この方法で、私はImageのサイズを設定することはできません。

私はPCLの部分からImageを使い、サイズを変更してIRandomAccessStreamReferenceに変換します。それを実現するために、私は私のImageがストリームに変換する必要があり、私はそれが必要な機能の> <

例働くようにする方法を見つけることができません。注

private IRandomAccessStreamReference ImageToIRandomAccessStreamReference(Image image) 
{ 
    //Here I can set the size of my Image 

    //I convert it into a stream 
    IRandomAccessStreamReference irasr = RandomAccessStreamReference.CreateFromStream(/* img? */); 

    //irasr is then created from img 

    //I return the IRandomAccessStreamReference needed by the MapIcon element 
    return irasr; 
} 

を:Image PARAMTER IMGXamarin.Forms.Image

だから最初、それは可能ですか? yesの場合、私はすでにMapIconのサイズを変更する方法について検索し、それが[MapIcon]クラスから直接ことはできません...私を助けることができる任意の助けに感謝。(https://msdn.microsoft.com/library/windows/apps/windows.ui.xaml.controls.maps.mapicon.aspx)の助けを

感謝を!

答えて

3

あなたは正しいです。このようなプロパティやメソッドを提供していないため、MapIconのサイズを直接変更することはできません。 MapIconのサイズは、ほとんどがMapIcon.Imageプロパティによって設定されたイメージのサイズによって制御されます。そして、Xamarin.Forms.Imageを使わずにこの画像のサイズを設定することができます。この画像のサイズを設定するには

、我々は次のようにBitmapDecoder classBitmapEncoder classBitmapTransform classを活用することができます。

private async System.Threading.Tasks.Task<RandomAccessStreamReference> ResizeImage(StorageFile imageFile, uint scaledWidth, uint scaledHeight) 
{ 
    using (IRandomAccessStream fileStream = await imageFile.OpenAsync(FileAccessMode.Read)) 
    { 
     var decoder = await BitmapDecoder.CreateAsync(fileStream); 

     //create a RandomAccessStream as output stream 
     var memStream = new InMemoryRandomAccessStream(); 

     //creates a new BitmapEncoder and initializes it using data from an existing BitmapDecoder 
     BitmapEncoder encoder = await BitmapEncoder.CreateForTranscodingAsync(memStream, decoder); 

     //resize the image 
     encoder.BitmapTransform.ScaledWidth = scaledWidth; 
     encoder.BitmapTransform.ScaledHeight = scaledHeight; 

     //commits and flushes all of the image data 
     await encoder.FlushAsync(); 

     //return the output stream as RandomAccessStreamReference 
     return RandomAccessStreamReference.CreateFromStream(memStream); 
    } 
} 

をそして、我々は最初にリサイズした画像ストリームの参照を作成するには、このメソッドを使用することができますし、

var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/Pin/customicon.png")); 
var imageReference = await ResizeImage(file, 64, 64); 

nativeMap.MapElements.Add(new MapIcon() 
{ 
    Title = pin.Name, 
    Image = imageReference, 
    Location = new Geopoint(new BasicGeoposition() { Latitude = pin.Position.Latitude, Longitude = pin.Position.Longitude }), 
    NormalizedAnchorPoint = new Windows.Foundation.Point(0.5, 1.0) 
}); 
+0

こんにちは!のように設定してください。ホー神、私はそんなに長い間探している!私は今夜​​それを試してみましょう、ありがとう! :) – Emixam23

+0

@ Emixam23こんにちは、どんな更新?私の答えがあなたの問題を解決できなかった場合は、私に知らせてください。 –

+0

それは完全に動作します、ありがとう:) – Emixam23

関連する問題