web-dev-qa-db-ja.com

Xamarin.Formsのエディターの境界線の色

Xamarin.Formsでエディターの境界線色を作成するにはどうすればよいですか?

これは link を使用しましたが、Androidでのみ機能します。すべてのプラットフォームで動作するようにしたい!

私はこれに少し初心者です。私を助けてください。

何か案が?

19
Vaikesh

エディターをStackLayoutBackgroundColor="your color"Padding="1"でラップし、エディターのBackgroundColorをフォームの同じ色に設定することでこれを実現することもできます。

このようなもの:

<StackLayout BackgroundColor="White">
      <StackLayout BackgroundColor="Black" Padding="1">
          <Editor BackgroundColor="White" />
      </StackLayout>
  ...
</StackLayout>

そんなに派手なわけではありませんが、これで少なくとも境界線ができます!

39
hsjolin

これが私が使用した完全なソリューションです。次の3つが必要です。

1-フォームプロジェクトでEditorを実装するカスタムクラス。

public class BorderedEditor : Editor
{

}

2-iOSプロジェクトのカスタムEditorのカスタムレンダラー。

public class BorderedEditorRenderer : EditorRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
    {
        base.OnElementChanged(e);

        if (Control != null)
        {
            Control.Layer.CornerRadius = 3;
            Control.Layer.BorderColor = Color.FromHex("F0F0F0").ToCGColor();
            Control.Layer.BorderWidth = 2;
        }
    }
}

3-iOSプロジェクトのExportRenderer属性。カスタムエディターにカスタムレンダラーを使用するようXamarinに指示します。

[Assembly: ExportRenderer(typeof(BorderedEditor), typeof(BorderedEditorRenderer))]

次に、Xamlでカスタムエディターを使用します。

<custom:BorderedEditor Text="{Binding TextValue}"/>
28
jrummell

最も簡単な方法は、周囲にフレームを追加することです。

 <Frame BorderColor="LightGray" HasShadow="False" Padding="0">
     <Editor/>
 </Frame>
5
lyndon hughey

ポータブルプロジェクトにこのコントロールを追加します

 public class PlaceholderEditor : Editor
{
    public static readonly BindableProperty PlaceholderProperty =
        BindableProperty.Create("Placeholder", typeof(string), typeof(string), "");

    public PlaceholderEditor()
    {
    }

    public string Placeholder
    {
        get
        {
            return (string)GetValue(PlaceholderProperty);
        }

        set
        {
            SetValue(PlaceholderProperty, value);
        }
    }       
}

Androidプロジェクトにこのレンダラーを追加:

[Assembly: ExportRenderer(typeof(PlaceholderEditor), typeof(PlaceholderEditorRenderer))]
namespace Tevel.Mobile.Packages.Droid
{


public class PlaceholderEditorRenderer : EditorRenderer
{ 

public PlaceholderEditorRenderer() {  }

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

        if (e.NewElement != null)
        {
            var element = e.NewElement as PlaceholderEditor;

            this.Control.Background = Resources.GetDrawable(Resource.Drawable.borderEditText);

            this.Control.Hint = element.Placeholder;
        }
    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (e.PropertyName == PlaceholderEditor.PlaceholderProperty.PropertyName)
        {
            var element = this.Element as PlaceholderEditor;
            this.Control.Hint = element.Placeholder;
        }
    }
}
}

リソース> drawableにXMLファイルborderEditText.xmlを追加

 <?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
  <item Android:state_focused="true">
<shape Android:shape="rectangle">
  <gradient
      Android:startColor="#FFFFFF"
      Android:endColor="#FFFFFF"
      Android:angle="270" />
  <stroke
      Android:width="3dp"
      Android:color="#F8B334" />
  <corners Android:radius="12dp" />
</shape>
  </item>
  <item>
<shape Android:shape="rectangle">
  <gradient Android:startColor="#FFFFFF" Android:endColor="#FFFFFF"  Android:angle="270" />
  <stroke Android:width="3dp" Android:color="#ccc" />
  <corners Android:radius="12dp" />
</shape>
  </item>
</selector>

Xaml:ヘッダー-xmlns:ctrls="clr-namespace:my control namespace;Assembly= my Assembly" コントロール:

<ctrls:PlaceholderEditor VerticalOptions="Fill" HorizontalOptions="StartAndExpand" Placeholder="add my comment title">
        </ctrls:PlaceholderEditor>
4
ahaliav fox

BorderColorEntryのカスタマイズはCustom Rendererではまだサポートされていないため、プラットフォームごとにXamarin.FormsXamarinのガイド )を実装する必要があります。

すでにAndroidでBorderColorを変更しているので、iOSの解決策はこちらで見つけることができます: http://forums.xamarin.com/discussion/comment/102557/#Comment_102557

1
Demitrian

これは確かに機能します。これを試してください。

Androidレンダラー

using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Android.Graphics;

    [Assembly: ExportRenderer(typeof(Entry), typeof(some.namespace.EntryRenderer))]
    namespace some.namespace
    {
        public class EntryRenderer : Xamarin.Forms.Platform.Android.EntryRenderer
        {
            protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
            {
                base.OnElementChanged(e);
                if (Control == null || Element == null || e.OldElement != null) return;

                var customColor = Xamarin.Forms.Color.FromHex("#0F9D58");
                Control.Background.SetColorFilter(customColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
            }
        }
    }
0
Parth Patel

グリッドとしてカスタムコントロールを構築します。その周りにBoxViewを構築し、エディターをマージンの中央に配置します。素敵ではないがシンプル...

    <Grid xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.Microsoft.com/winfx/2009/xaml"
             xmlns:CustomControls="clr-namespace:xxx.CustomControls"
             x:Class="xxx.CustomControls.EditorWithBorder" BackgroundColor="White"
                x:Name="this">
    <Grid.RowDefinitions>
        <RowDefinitionCollection>
            <RowDefinition Height="1"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1"/>
        </RowDefinitionCollection>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinitionCollection>
            <ColumnDefinition Width="1"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1"/>
        </ColumnDefinitionCollection>
    </Grid.ColumnDefinitions>

    <Editor Text="{Binding Source={x:Reference this},Path=EditorText, Mode=TwoWay}" TextColor="Orange" Margin="20,10,20,10" FontSize="{StaticResource FontSizeLarge}"
                                Grid.Row="1" Grid.Column="1" />


    <BoxView Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" BackgroundColor="Orange"
             ></BoxView>

    <BoxView Grid.Row="0" Grid.Column="0" Grid.RowSpan="3" BackgroundColor="Orange"

             ></BoxView>

    <BoxView Grid.Row="0" Grid.Column="2" Grid.RowSpan="3" BackgroundColor="Orange" HeightRequest="1"

             ></BoxView>
    <BoxView Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" BackgroundColor="Orange" HeightRequest="1"

             ></BoxView>
</Grid>
0
Alex Freund

Androidレンダラーへの簡単な方法

if (((Editor)Element).HasBorder)
                {
                    GradientDrawable Gd = new GradientDrawable();
                    Gd.SetColor(Android.Resource.Color.HoloRedDark);
                    Gd.SetCornerRadius(4);
                    Gd.SetStroke(2, Android.Graphics.Color.LightGray);
                    Control.SetBackground(Gd);
                }
0
Abdullah Tahan