自定義xamarin.forms Entry 背景色以及邊框


  1. 創建

     

    一個Xamarin.Forms自定義控件。

   

自定義Entry控件可以通過繼承來創建Entry控制,顯示在下面的代碼示例:

public class MyEntry : Entry { }

   

  1. 消費

     

    從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控制在頁面上居中垂直和水平。

自定義渲染器現在可以添加到每個應用程序項目,以定制控件的每個平台上亮相。

  1. 創建

     

    為每個平台上的控制自定義渲染器

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);
            }
        }
    }
}



   

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM