-
創建
一個Xamarin.Forms自定義控件。
自定義Entry控件可以通過繼承來創建Entry控制,顯示在下面的代碼示例:
public class MyEntry : Entry { }
-
消費
從Xamarin.Forms自定義控件。
該MyEntry控制可在XAML通過宣布其位置的命名空間,使用控制元素的命名空間前綴引用在PCL項目。 下面的代碼示例顯示了如何MyEntry控制可以通過一個XAML頁面消耗:
<ContentPage ...
xmlns:local="clr-namespace:CustomRenderer;assembly=CustomRenderer"
...>
...
<local:MyEntry Text="In Shared Code" />
...
</ContentPage>
在local名稱空間前綴可以任意取名。 然而, clr-namespace和assembly值必須自定義控件的細節相匹配。 一旦命名空間聲明的前綴用於引用自定義控制。下面的代碼示例顯示了如何MyEntry控制可以通過一個C#頁面消耗:
public class MainPage : ContentPage
{
public MainPage ()
{
Content = new StackLayout {
Children = {
new Label {
Text = "Hello, Custom Renderer !",
},
new MyEntry {
Text = "In Shared Code",
}
},
VerticalOptions = LayoutOptions.CenterAndExpand,
HorizontalOptions = LayoutOptions.CenterAndExpand,
};
}
}
此代碼實例化一個新ContentPage對象,將顯示一個Label ,並MyEntry控制在頁面上居中垂直和水平。
自定義渲染器現在可以添加到每個應用程序項目,以定制控件的每個平台上亮相。
-
創建
為每個平台上的控制自定義渲染器
3.1 創建的子類EntryRenderer呈現本地控制類。
3.2 覆蓋OnElementChanged呈現本機控制方法和編寫邏輯來定制控制。 建立相應的Xamarin.Forms控制時,此方法被調用。
3.3 一個添加ExportRenderer屬性自定義渲染類來指定,它11會被用來渲染Xamarin.Forms控制。 這個屬性是用來注冊Xamarin.Forms定制的渲染器。
它是可選的,以提供在每個平台項目定制渲染器。 如果自定義渲染器沒有被注冊,那么將使用該控件的基類的默認渲染。
下圖說明在示例應用程序的每個項目的責任,與他們之間的關系一起:
該MyEntry控制是通過特定於平台的呈現MyEntryRenderer類,全部由獲得EntryRenderer每個平台類。 這導致每個MyEntry控制正在呈現與特定於平台的背景顏色,顯示在下面的截圖:
該EntryRenderer類公開OnElementChanged方法,以使相應的本地控制在創建Xamarin.Forms控制時被調用。 該方法獲取ElementChangedEventArgs包含參數OldElement和NewElement屬性。 這些屬性代表了Xamarin.Forms元素渲染器附着於和Xamarin.Forms元素渲染器分別連接到。 在示例應用程序的OldElement屬性將為null和NewElement屬性將包含的參考MyEntry控制。
在一個重寫版本OnElementChanged的方法MyEntryRenderer類是執行本機控制定制的地方。 類型化參考本地控制平台上使用可通過訪問Control特性。 此外,向Xamarin.Forms控制的基准是的被呈現可通過獲得Element屬性,盡管它不是在示例應用程序使用。
每個自定義渲染器類裝飾着ExportRenderer的注冊與Xamarin.Forms渲染屬性。 該屬性有兩個參數 - 所呈現的Xamarin.Forms控件的類型名稱,自定義渲染器的類型名稱。 該assembly前綴屬性指定屬性適用於整個組件。
以下各節討論每個特定平台的實施MyEntryRenderer定制渲染器類。
創建iOS上的自定義呈現
下面的代碼示例顯示了iOS平台的自定義呈現:
using Xamarin.Forms.Platform.iOS;
[assembly: ExportRenderer (typeof(MyEntry), typeof(MyEntryRenderer))]
namespace CustomRenderer.iOS
{
public class MyEntryRenderer : EntryRenderer
{
protected override void OnElementChanged (ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged (e);
if (Control != null) {
// do whatever you want to the UITextField here!
Control.BackgroundColor = UIColor.FromRGB (204, 153, 255);
Control.BorderStyle = UITextBorderStyle.Line;
}
}
}
}
基類的調用OnElementChanged方法實例在iOS UITextField控制,對控制的引用被分配到渲染器的Control性能。 然后將背景顏色設置為淺紫色與UIColor.FromRGB方法。
創建Android上的自定義呈現
下面的代碼示例顯示了Android平台定制的渲染器:
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer (typeof(MyEntry), typeof(MyEntryRenderer))]
namespace CustomRenderer.Android
{
class MyEntryRenderer : EntryRenderer
{
protected override void OnElementChanged (ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged (e);
if (Control != null) {
Control.SetBackgroundColor (global::Android.Graphics.Color.LightGreen);
}
}
}
}
基類的調用OnElementChanged方法實例化一個Android EditText控制,對控制的引用被分配到渲染器的Control性能。 然后將背景顏色設置為淺綠色與Control.SetBackgroundColor方法。
寫在后邊的話
為了符合要求,需要有邊框效果所以參考資料如下:
https://forums.xamarin.com/discussion/18056/border-radius-and-border-on-entry
上代碼"
using Xamarin.Forms.Platform.Android;
using Xamarin.Forms;
using CustomRenderer;
using Android.Graphics.Drawables;
[assembly: ExportRenderer (typeof(MyEntry), typeof(MyEntryRenderer))]
namespace CustomRenderer
{
class MyEntryRenderer : EntryRenderer
{
protected override void OnElementChanged (ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged (e);
if (Control != null) {
GradientDrawable gd = new GradientDrawable();
gd.SetColor(Android.Graphics.Color.Green);
gd.SetCornerRadius(10);
gd.SetStroke(10, Android.Graphics.Color.LightGray);//邊框寬度和邊框顏色
this.Control.SetBackgroundDrawable(gd);
}
}
}
}