2016-07-23 40 views
1

我使用Xam.Plugins.Forms.Svg來支持svg圖像。我需要改變形象,所以我嘗試:Xamarin Xam.Plugins.Forms.Svg更改SvgPath以重新渲染圖像

在XAML結合:

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

直接從C#更改:

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

的SvgPath屬性是變化的,但圖像不會重新渲染。

有沒有解決這個問題的方法?

+0

做的源(圖標)實現INotifyPropertyChanged? – Jason

+0

@Jason我的視圖模型確實實現了INotifyPropertyChanged,並且所有標籤都會更新。 – cuddlecheek

回答

1

這是在渲染器的編寫方式的問題,你需要創建一個SvgImage對象,並取代目前在你的頁面的渲染器,以工作爲靜態Image是路從新的SVG文件更新。

您可以通過重寫OnElementPropertyChanged事件修補渲染和SvgPath屬性名的變化做出反應:

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