{"id":16031,"date":"2014-12-22T16:18:20","date_gmt":"2014-12-22T21:18:20","guid":{"rendered":"http:\/\/blog.xamarin.com\/?p=16031"},"modified":"2019-04-02T15:55:29","modified_gmt":"2019-04-02T22:55:29","slug":"extending-xamarin-forms-with-control-plugins","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/xamarin\/extending-xamarin-forms-with-control-plugins\/","title":{"rendered":"Extending Xamarin.Forms with Control Plugins"},"content":{"rendered":"<p>With an enhanced extensibility framework, Xamarin.Forms is an amazing platform for developing plugins that add cross-platform functionality; however, you can take it a step further by developing custom controls for Xamarin.Forms and packaging them into your very own Control Plugin for Xamarin.Forms. We have had several posts on how to use <a href=\"\/using-custom-controls-in-xamarin.forms-on-android\/\" title=\"Xamarin.Forms Custom controls android\">custom controls in Android<\/a>, <a href=\"\/using-custom-controls-in-xamarin.forms-on-windows-phone\/\" title=\"Custom Controls Xamarin.Forms Windows Phone\">Windows Phone<\/a>. <img decoding=\"async\" src=\"\/wp-content\/uploads\/sites\/44\/2019\/04\/circle_image_icon-1.png\" alt=\"Circle Image Control Plugin\" width=\"125\" height=\"125\" class=\"alignright size-full wp-image-16032\" \/>More recently how to create <a href=\"\/elegant-circle-images-in-xamarin.forms\/\" title=\"Xamarin.Forms Circle Images\">elegant circle images for Xamarin.Forms<\/a> across all three platforms. Let&#8217;s see how we can take this custom control and create a re-distributable control plugin for Xamarin.Forms that you could enter in our <a href=\"\/holiday-contest-create-a-plugin-for-xamarin\/\" title=\"Holiday Contest\" target=\"_blank\">holiday plugin for Xamarin contest<\/a>.<\/p>\n<h2>Getting Started<\/h2>\n<p>Instead of embedding all of the circle image logic, <a href=\"\/elegant-circle-images-in-xamarin.forms\/\" title=\"Elegant Circle Images\">which we have already finished<\/a>, into our Xamarin.Forms application you will want to create your own library specifically for the control. This will consist of a Portable Class Library with the CircleImage class and then a class library for iOS, Android, and Windows Phone. I have created some <a href=\"https:\/\/visualstudiogallery.msdn.microsoft.com\/afead421-3fbf-489a-a4e8-4a244ecdbb1e\" title=\"Plugin for Xamarin Templates\">handy templates for Visual Studio<\/a> to get you started. <\/p>\n<p>An important addition is that in each of your custom renderers you will need to add an initialization method:<\/p>\n<p><code>public static void Init() { }<\/code><\/p>\n<p>This will be familiar to you if you have been creating <a href=\"\/creating-reusable-plugins-for-xamarin.forms\/\" title=\"Plugins for Xamarin.Forms\">plugins for Xamarin.Forms<\/a>, as this insures our control does not getting linked out in the application we add it to. <\/p>\n<h2>Adding Bindable Properties<\/h2>\n<p>Since your control plugin will be distributed you may want add a few custom bindable properties if it makes sense for your control. For the CircleImage I have added <code>BorderThickness<\/code> and <code>BorderColor<\/code> as additional properties that the CircleImage can use.<\/p>\n<pre class=\"lang:csharp decode:true\">\r\n\/\/\/ &lt;summary&gt;\r\n\/\/\/ Thickness property of border\r\n\/\/\/ &lt;\/summary&gt;\r\npublic static readonly BindableProperty BorderThicknessProperty =\r\n  BindableProperty.Create&lt;CircleImage, int&gt;(\r\n    p =&gt; p.BorderThickness, 0);\r\n\r\n\/\/\/ &lt;summary&gt;\r\n\/\/\/ Border thickness of circle image\r\n\/\/\/ &lt;\/summary&gt;\r\npublic int BorderThickness\r\n{\r\n  get { return (int)GetValue(BorderThicknessProperty); }\r\n  set { SetValue(BorderThicknessProperty, value); }\r\n}\r\n<\/pre>\n<p> <img decoding=\"async\" src=\"\/wp-content\/uploads\/sites\/44\/2019\/04\/CircleImagesPlugin-500x1024.png\" alt=\"CircleImagesPlugin\" width=\"200\" class=\"aligncenter size-large wp-image-16033\" \/><\/p>\n<h2>Packaging the Plugin<\/h2>\n<p>After moving all of the logic into this new project you are ready to package your control and publish it on NuGet. Part of the <a href=\"https:\/\/visualstudiogallery.msdn.microsoft.com\/afead421-3fbf-489a-a4e8-4a244ecdbb1e\" title=\"Plugin for Xamarin Templates\">Visual Studio templates<\/a> that are available will automatically create the nuspec that will need to be uploaded. Here is what the Circle Image&#8217;s looks like:<\/p>\n<pre class=\"lang:xml decode:true\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\r\n&lt;package xmlns=&quot;http:\/\/schemas.microsoft.com\/packaging\/2010\/07\/nuspec.xsd&quot;&gt;\r\n   &lt;metadata minClientVersion=&quot;2.8.1&quot;&gt;\r\n       &lt;id&gt;Xam.Plugins.Forms.ImageCircle&lt;\/id&gt;\r\n       &lt;version&gt;1.0.0.2&lt;\/version&gt;\r\n       &lt;title&gt;Image Circle Control Plugin for Xamarin.Forms&lt;\/title&gt;\r\n       &lt;dependencies&gt;\r\n         &lt;dependency id=&quot;Xamarin.Forms&quot; version=&quot;1.2.3.6257&quot; \/&gt;\r\n       &lt;\/dependencies&gt;\r\n   &lt;\/metadata&gt;\r\n   &lt;files&gt;\r\n      &lt;!--Core--&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.Abstractions\\bin\\Release\\ImageCircle.Forms.Plugin.Abstractions.dll&quot; target=&quot;lib\\portable-net45+wp8+win8+MonoAndroid10+MonoTouch10\\ImageCircle.Forms.Plugin.Abstractions.dll&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.Abstractions\\bin\\Release\\ImageCircle.Forms.Plugin.Abstractions.xml&quot; target=&quot;lib\\portable-net45+wp8+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10\\ImageCircle.Forms.Plugin.Abstractions.xml&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.Abstractions\\bin\\Release\\ImageCircle.Forms.Plugin.Abstractions.pdb&quot; target=&quot;lib\\portable-net45+wp8+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10\\ImageCircle.Forms.Plugin.Abstractions.pdb&quot; \/&gt;\r\n\r\n     &lt;!--Win Phone Silverlight--&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.WindowsPhone\\bin\\Release\\ImageCircle.Forms.Plugin.WindowsPhone.dll&quot; target=&quot;lib\\wp8\\ImageCircle.Forms.Plugin.WindowsPhone.dll&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.WindowsPhone\\bin\\Release\\ImageCircle.Forms.Plugin.WindowsPhone.xml&quot; target=&quot;lib\\wp8\\ImageCircle.Forms.Plugin.WindowsPhone.xml&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.WindowsPhone\\bin\\Release\\ImageCircle.Forms.Plugin.WindowsPhone.pdb&quot; target=&quot;lib\\wp8\\ImageCircle.Forms.Plugin.WindowsPhone.pdb&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.Abstractions\\bin\\Release\\ImageCircle.Forms.Plugin.Abstractions.dll&quot; target=&quot;lib\\wp8\\ImageCircle.Forms.Plugin.Abstractions.dll&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.Abstractions\\bin\\Release\\ImageCircle.Forms.Plugin.Abstractions.xml&quot; target=&quot;lib\\wp8\\ImageCircle.Forms.Plugin.Abstractions.xml&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.Abstractions\\bin\\Release\\ImageCircle.Forms.Plugin.Abstractions.pdb&quot; target=&quot;lib\\wp8\\ImageCircle.Forms.Plugin.Abstractions.pdb&quot; \/&gt;\r\n\r\n     \r\n     &lt;!--Xamarin.Android--&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.Android\\bin\\Release\\ImageCircle.Forms.Plugin.Android.dll&quot; target=&quot;lib\\MonoAndroid10\\ImageCircle.Forms.Plugin.Android.dll&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.Android\\bin\\Release\\ImageCircle.Forms.Plugin.Android.xml&quot; target=&quot;lib\\MonoAndroid10\\ImageCircle.Forms.Plugin.Android.xml&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.Android\\bin\\Release\\ImageCircle.Forms.Plugin.Android.pdb&quot; target=&quot;lib\\MonoAndroid10\\ImageCircle.Forms.Plugin.Android.pdb&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.Abstractions\\bin\\Release\\ImageCircle.Forms.Plugin.Abstractions.dll&quot; target=&quot;lib\\MonoAndroid10\\ImageCircle.Forms.Plugin.Abstractions.dll&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.Abstractions\\bin\\Release\\ImageCircle.Forms.Plugin.Abstractions.xml&quot; target=&quot;lib\\MonoAndroid10\\ImageCircle.Forms.Plugin.Abstractions.xml&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.Abstractions\\bin\\Release\\ImageCircle.Forms.Plugin.Abstractions.pdb&quot; target=&quot;lib\\MonoAndroid10\\ImageCircle.Forms.Plugin.Abstractions.pdb&quot; \/&gt;\r\n\r\n     &lt;!--Xamarin.iOS--&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.iOS\\bin\\iPhone\\Release\\ImageCircle.Forms.Plugin.iOS.dll&quot; target=&quot;lib\\MonoTouch10\\ImageCircle.Forms.Plugin.iOS.dll&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.iOS\\bin\\iPhone\\Release\\ImageCircle.Forms.Plugin.iOS.xml&quot; target=&quot;lib\\MonoTouch10\\ImageCircle.Forms.Plugin.iOS.xml&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.Abstractions\\bin\\Release\\ImageCircle.Forms.Plugin.Abstractions.dll&quot; target=&quot;lib\\MonoTouch10\\ImageCircle.Forms.Plugin.Abstractions.dll&quot; \/&gt;\r\n     &lt;file src=&quot;ImageCircle.Forms.Plugin.Abstractions\\bin\\Release\\ImageCircle.Forms.Plugin.Abstractions.xml&quot; target=&quot;lib\\MonoTouch10\\ImageCircle.Forms.Plugin.Abstractions.xml&quot; \/&gt;\r\n\r\n   &lt;\/files&gt;\r\n&lt;\/package&gt;\r\n<\/pre>\n<p>With your control plugin packaged up you are now free to distribute it to everyone via NuGet. Be sure to read the <a href=\"http:\/\/docs.nuget.org\/\" title=\"NuGet Documentation\">NuGet documentation<\/a> on how to get started. <\/p>\n<h2>Learn More<\/h2>\n<p>You can find the <a href=\"https:\/\/www.nuget.org\/packages\/Xam.Plugins.Forms.ImageCircle\/\" title=\"Image Circle Control Plugin for Xamarin.Forms\">Circle Image Control Plugin live on NuGet<\/a> and the full <a href=\"https:\/\/github.com\/jamesmontemagno\/Xamarin.Plugins\/tree\/master\/ImageCircle\" title=\"Circle Image Code\">source code available on GitHub<\/a>. To find out more information on creating plugins for Xamarin be sure to watch the <a href=\"https:\/\/plus.google.com\/events\/c4uvjot4v4urdju6vl4sal773jg\" title=\"Creating Plugins for Xamarin Hangouts Recording\" target=\"_blank\">recording of our live Google+ Hangouts <\/a>session from last week. <\/p>\n<p>In addition to these resources I have recorded a short getting started with the Plugin for Xamarin templates that enables you to get up and running quickly. <\/p>\n<p><iframe width=\"480\" height=\"360\" src=\"\/\/www.youtube.com\/embed\/QbsKGxo6d74\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>With an enhanced extensibility framework, Xamarin.Forms is an amazing platform for developing plugins that add cross-platform functionality; however, you can take it a step further by developing custom controls for Xamarin.Forms and packaging them into your very own Control Plugin for Xamarin.Forms. We have had several posts on how to use custom controls in Android, [&hellip;]<\/p>\n","protected":false},"author":544,"featured_media":39167,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2],"tags":[4,16],"class_list":["post-16031","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developers","tag-xamarin-platform","tag-xamarin-forms"],"acf":[],"blog_post_summary":"<p>With an enhanced extensibility framework, Xamarin.Forms is an amazing platform for developing plugins that add cross-platform functionality; however, you can take it a step further by developing custom controls for Xamarin.Forms and packaging them into your very own Control Plugin for Xamarin.Forms. We have had several posts on how to use custom controls in Android, [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/xamarin\/wp-json\/wp\/v2\/posts\/16031","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/xamarin\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/xamarin\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/xamarin\/wp-json\/wp\/v2\/users\/544"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/xamarin\/wp-json\/wp\/v2\/comments?post=16031"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/xamarin\/wp-json\/wp\/v2\/posts\/16031\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/xamarin\/wp-json\/wp\/v2\/media\/39167"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/xamarin\/wp-json\/wp\/v2\/media?parent=16031"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/xamarin\/wp-json\/wp\/v2\/categories?post=16031"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/xamarin\/wp-json\/wp\/v2\/tags?post=16031"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}