2016-07-23 3 views
1

私はsvgイメージをサポートするためにXam.Plugins.Forms.Svgを使用します。私は、画像を変更する必要があるので、私が試した:C#のから直接それを変更するXamarin Xam.Plugins.Forms.Svgイメージを再レンダリングするためにSvgPathを変更します。

<abstractions:SvgImage 
    SvgPath="{Binding CurrentWeather.IconSource, StringFormat='Umbrella.Images.{0:F0}.svg'}" 
    .... 
    /> 

はXAMLに結合

icon.SvgPath = "Umbrella.Images." + currentWeather.IconSource + ".svg"; 

SvgPath属性が変更を行い、画像は再レンダリングされません。

これに解決策はありますか?

+0

はありませんソース(アイコン)は、INotifyPropertyChangedを実装していますか? – Jason

+0

@ Jason私のビューモデルはINotifyPropertyChangedを実装しており、すべてのラベルは更新されます。 – cuddlecheek

答えて

1

それはレンダラが書かれている方法で、あなたは新しいSvgImageオブジェクトを作成し、あなたのページにレンダラがために、静的Imageために仕事のやり方を、現在の上交換する必要があるだろう問題です新しいSVGファイルから更新されました。

あなたはOnElementPropertyChangedイベントをオーバーライドすることで、レンダラーにパッチを適用し、SvgPathのPropertyName変化に対応することができます

iOSの例:

protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
{ 
    base.OnElementPropertyChanged(sender, e); 
    if (e.PropertyName == "SvgPath") 
    { 
     var svgStream = _formsControl.SvgAssembly.GetManifestResourceStream(_formsControl.SvgPath); 
     var reader = new SvgReader(new StreamReader(svgStream), new StylesParser(new ValuesParser()), new ValuesParser()); 
     var graphics = reader.Graphic; 
     var canvas = new ApplePlatform().CreateImageCanvas(graphics.Size); 
     graphics.Draw(canvas); 
     var image = canvas.GetImage(); 
     var uiImage = image.GetUIImage(); 
     Control.Image = uiImage; 
    } 
} 

参考:https://github.com/paulpatarinski/Xamarin.Forms.Plugins/blob/eab230fcf4158a288387727c15903a954e01cdaa/SVG/SVG/SVG.Forms.Plugin.Android/SvgImageRenderer.cs

参考:https://github.com/paulpatarinski/Xamarin.Forms.Plugins/blob/eab230fcf4158a288387727c15903a954e01cdaa/SVG/SVG/SVG.Forms.Plugin.iOS/SvgImageRenderer.cs

+0

ありがとう、それは私が必要とするものです。 – cuddlecheek

関連する問題