Xamarin的输入框底部线条颜色没有变化

3

我正在开发一个Android应用程序。现在我正在创建主页,其中我插入了一个具有底部线的Entry。在我的预览器上,底部线是White,而在我的手机上它出现为Black

所以为了解决这个问题,我决定尝试使用渲染器来修复它。 我在App中创建了一个名为CustomEntryRenderer的类,它继承自Entry。 然后我在App.Android中创建了一个名为CustomEntryRednererAndroid的类,它应该更改条目下方线的颜色。但它没有影响到它。我尝试使用在互联网上找到的一些自定义渲染器做同样的事情。

例如,删除底线也不会影响程序:

removing line

MainPage.xaml中的Entry:

<Entry 

        Grid.Row="4"
        Grid.ColumnSpan="2"
        TextColor="Silver"         
        Placeholder="Write Your nickname"
        PlaceholderColor="Silver"

        />

自定义入口渲染器:

 public class CustomEntryRenderer : Entry
{
}

CustomEntryRendererAndroid:

[assembly: ExportRenderer(typeof(CustomEntryRenderer), typeof(MyEntryRenderer))]
namespace App3.Droid
{
public class MyEntryRenderer : EntryRenderer
{

    public MyEntryRenderer(Context context) : base(context) { }
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        if (Control == null || e.NewElement == null) return;

        if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
            Control.BackgroundTintList = ColorStateList.ValueOf(Android.Graphics.Color.White);
        else
            Control.Background.SetColorFilter(Android.Graphics.Color.White, PorterDuff.Mode.SrcAtop);
    }
}

}

Android的最佳答案是:在CustomEntryRendererAndroid.cs中,我不知道为什么要使用Android.Graphic而不是Xamarin.Forms.Color。但我认为这不是问题所在。

我已经尝试了几个小时,但无法找到解决方法。希望有任何想法。

2个回答

6
在xaml中,您正在使用默认的Entry控件而不是您的CustomEntryRenderer,这正是您的渲染器所影响的。此外,您可能需要将其重命名,因为它实际上不是您的渲染器,而是您的自定义控件。
要解决问题,您可以将渲染器typeof(CustomEntryRenderer)更改为typeof(Entry),以默认影响应用程序中的所有Android输入框。例如,对于我测试应用程序中的所有输入框,这种方法都有效。
[assembly: ExportRenderer(typeof(Entry), typeof(MyEntryRenderer))]
namespace YourNameSpace
{
    public class MyEntryRenderer : EntryRenderer
    {
        public MyEntryRenderer(Context context) : base(context) { }

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

            if (Control == null || e.NewElement == null) return;

            if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                Control.BackgroundTintList = ColorStateList.ValueOf(Android.Graphics.Color.White);
            else
                Control.Background.SetColorFilter(Android.Graphics.Color.White, PorterDuff.Mode.SrcAtop);
        }
    }
}

另一种选择是将你的XAML代码在MainPage中切换成使用你的自定义控件。例如:<local:CustomEntryRenderer/>

谢谢回答!我尝试将 typeof(CustomEntryRenderer) 更改为 typeof(Entry),但在做了这个之后,使用 Live Player 启动我的应用时,Xamarin Live 就会崩溃。每次都是这样,我还尝试了不同的渲染器。此外,您知道为什么预览器显示的行颜色与在手机上启动的应用程序不同吗? - D.Weltrowski
我更新了我的答案,使其更加具体。如果你只是将它更改为Entry,那么你可以删除你的CustomEntryRender类。之后,我会确保删除bin和obj文件夹并重新构建你的项目。至于Xamarin Live Previewer,上次我尝试使用它时仍然存在很多错误,并且仍在开发中,所以如果可能的话,最好直接部署到设备上。 - Nick Peppers
非常感谢!这解决了问题,我还必须直接在我的手机上部署。 - D.Weltrowski

4

将这个代码添加到Styles.xml中可以全局修复此问题。

<item name="colorControlNormal">#1BB8A3</item>"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接