【问题标题】:Rounded corner for Entry - Xamarin forms UWP入口圆角 - Xamarin 形成 UWP
【发布时间】:2019-03-29 01:40:17
【问题描述】:

有没有什么办法可以自定义入口的半径以使其具有略圆的角?

【问题讨论】:

标签: xamarin.forms customization xamarin.uwp custom-renderer xamarin.forms.entry


【解决方案1】:

您可以在 xamarin.forms 中使用 Custom Renderer

在 iOS 中

//...
using App11;
using App11.iOS;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(MyEntry), typeof(MyiOSEntry))]
namespace App11.iOS
{
  public class MyiOSEntry:EntryRenderer
  {
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        if (Control != null)
        {
            Control.Layer.MasksToBounds = true;
            Control.Layer.CornerRadius = 10;  //set the rounded corner
            Control.Layer.BorderColor = UIColor.Red.CGColor;
            Control.Layer.BorderWidth = 3;
        }
    }
 }
}

在安卓中

Resource->drawable文件夹中创建一个xml文件edit_text_style.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item>
   <shape
     android:shape="rectangle">
    <solid
      android:color="#ffffff" />
    <corners
      android:radius="10dp" />
    <stroke
      android:width="2dp"
      android:color="#3bbdfa" />
   </shape>
</item>

Custom Renderer

using Android.Support.V4.Content.Res;
using App11;
using App11.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(MyEntry), typeof(MyAndriodEntry))]
namespace App11.Droid
{
 public class MyAndriodEntry:EntryRenderer
 {
   public MyAndriodEntry(Context context):base(context)
    {

    }

    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        if(Control!=null)
        {
            Control.SetBackground(ResourcesCompat.GetDrawable(Resources, Resource.Drawable.edit_text_style, null) );
        }

    }
  }
}

在 UWP 中

创建一个名为 Styles 的文件夹,并将一个新项目添加为 Resource Dictionary 类型并将其命名为 Dictionary1.xaml 在 Dictionary1.xaml 中将此代码用于圆形文本框。

Custom Renderer

using App11;
using App11.UWP;
using Windows.UI.Xaml.Controls;
using Xamarin.Forms;
using Xamarin.Forms.Platform.UWP;

[assembly: ExportRenderer(typeof(MyEntry), typeof(MyUWPEntry))]
namespace App11.UWP
{
  public class MyUWPEntry:EntryRenderer
  {

    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        if(Control!=null)
        {
           Control.Style = (Windows.UI.Xaml.Style)App11.UWP.App.Current.Resources["StyleRoundedTextBox"];
        }

    }
  }
}

如何更改此样式以及如何创建此代码? 很简单,在 msdn.com 中搜索 uwp 中的“objectName”默认样式,然后您将找到所需对象的默认样式。以您想要的方式更改它并将其直接添加到应用程序资源或链接它(就像我在这里所做的那样)然后在 CustomRenderer 中加载您的样式

关于UWP的更多细节你可以参考here

在表单中

using System;
using System.Collections.Generic;
using System.Text;
using Xamarin.Forms;

namespace App11
{
 public class MyEntry : Entry
 {
    public MyEntry()
    {

    }
 }
}

在 xxx.cs 文件中

Content = new StackLayout
 {
    Children = {
                 new MyEntry {Text = "In Shared Code",}
                },
    VerticalOptions = LayoutOptions.CenterAndExpand,
    HorizontalOptions = LayoutOptions.CenterAndExpand,
 };

【讨论】:

    【解决方案2】:

    对于 Windows 应用,您可以使用渲染器自定义条目。

    public class CustomEntryRenderer : ViewRenderer<CustomEntry, TextBox>
    {
        protected override void OnElementChanged(ElementChangedEventArgs<CustomEntry> e)
        {
            base.OnElementChanged(e);
            var textBox = new TextBox();
            textBox.BorderThickness = new Windows.UI.Xaml.Thickness(1);
            textBox.BorderBrush = new SolidColorBrush(GetSolidColorBrush("#444444").Color);
            textBox.CornerRadius = new Windows.UI.Xaml.CornerRadius(10);
            this.SetNativeControl(textBox);
        }
        public SolidColorBrush GetSolidColorBrush(string hex)
        {
            hex = hex.Replace("#", string.Empty);
            byte r = (byte)(Convert.ToUInt32(hex.Substring(0, 2), 16));
            byte g = (byte)(Convert.ToUInt32(hex.Substring(2, 2), 16));
            byte b = (byte)(Convert.ToUInt32(hex.Substring(4, 2), 16));
    
            SolidColorBrush myBrush = new SolidColorBrush(Windows.UI.Color.FromArgb(255, r, g, b));
            return myBrush;
        }
    }
    

    【讨论】:

      【解决方案3】:

      天哪,没那么难。

      除非我遗漏了什么,否则只需将其包裹在 Frame 中,并将 IsClippedToBounds 设置为 true,然后在框架上放置一个圆角半径。

      我猜也许有某种原因这不是一个好的解决方案,但我经常使用它。

      【讨论】:

        猜你喜欢
        • 2018-11-16
        • 1970-01-01
        • 2018-06-27
        • 1970-01-01
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多