2016-10-06 6 views
2

저는 Xamarin을 처음 접했고 현재 Xamarin Forms PCL에서 프로젝트를 진행하고 있습니다.Xamarin 양식에서 피커 글꼴 색상 및 크기를 변경하는 방법은 무엇입니까?

피커의 글꼴 색 및 크기를 변경하는 방법이 있습니까?

<Picker x:Name="pkr_color" Grid.Row="4" Grid.Column="1" HorizontalOptions="FillAndExpand" 
    BackgroundColor="#ededed" Title="Select Color"> 
     <Picker.Items> 
     <x:String>Red</x:String> 
     <x:String>Blue</x:String> 
     <x:String>Green</x:String> 
     </Picker.Items> 
    </Picker> 

미리 감사드립니다.

+1

모든 렌더링을 사용하고 모든 플랫폼에서 구현하십시오. –

답변

1

각 플랫폼에 대한 사용자 지정 렌더러를 작성해야합니다.

using System; 
using Project.iOS; 
using Xamarin.Forms; 
using Xamarin.Forms.Platform.iOS; 

[assembly: ExportRenderer (typeof (Picker), typeof (CustomPickerRenderer))] 
namespace Project.iOS 
{ 
    public class CustomPickerRenderer : PickerRenderer 
    { 
     protected override void OnElementChanged (ElementChangedEventArgs<Picker> e) 
     { 
      base.OnElementChanged (e); 
      if (Control != null) { 
       Control.TextColor = UIKit.UIColor.White; 
      } 
     } 
    } 
} 

다음은 iOS의 예입니다. 이렇게하면 텍스트의 색상이 변경되고 Android의 경우 비슷한 작업을 수행하고 글꼴 크기 변경을 추가해야합니다.

+0

안녕하세요, 저는 timepicker를 사용하고 분 간격을 30 분으로 맞춤 설정하고 있습니다. 이제 AM PM처럼 0과 30 두 값만 표시하려고합니다. 나는 같은 가치를 반복하지 않는다는 것을 의미한다. 그게 어떻게 가능해? –

2

나는 "WidthRequest는"우리는 선택기의

2

글꼴 크기는 PCL 코드를 변경할 수 있습니다 피커의 크기를 늘릴 수 있습니다 사용하여 텍스트 색상을

**In Xaml** 

<Picker SelectedIndexChanged="OnColorPickerSelected" TextColor="{Binding TextColor}"/> 


**In Code Behind** 

private void OnColorPickerSelected(object sender, EventArgs e) 
{ 
    ((ViewModel)BindingContext).Color= pkr_color.Items[pkr_color.SelectedIndex]; 

    ChooseColorPickerTextColor(((ViewModel)BindingContext).Color, pkr_color); 
} 

**Implement ChooseColorPickerTextColor Method Here** 

    private void ChooseColorPickerTextColor(string selectedColor, Picker pickerName) 
    { 
     Picker colorPickerTextColor = pickerName; 

     if (selectedColor == "Red") 
     { 
      colorPickerTextColor.TextColor = Color.Red; 
     } 
     else if (selectedColor == "Yellow") 
     { 
      colorPickerTextColor.TextColor = Color.Yellow; 
     } 
     else if (selectedColor == "Green") 
     { 
      colorPickerTextColor.TextColor = Color.Green; 
     } 
     else if (selectedColor == "Blue") 
     { 
      colorPickerTextColor.TextColor = Color.Blue; 
     } 
     else if (selectedColor == "Maroon") 
     { 
      colorPickerTextColor.TextColor = Color.Maroon; 
     } 
     else if (selectedColor == "Pink") 
     { 
      colorPickerTextColor.TextColor = Color.Pink; 
     } 
     else 
     { 
      colorPickerTextColor.TextColor = Color.Aqua; 
     } 
    } 

를 취득하는 것이 도움이 코드 아래 바랍니다.

만들기에서 MainPage.xaml 파일

<Picker x:Name="PickerList" Title="Select Any One" IsVisible="False" SelectedIndexChanged="PickerList_SelectedIndexChanged"> 
     <Picker.Items> 
      <x:String>Option 1</x:String> 
      <x:String>Option 2</x:String> 
      <x:String>Option 3</x:String> 
     </Picker.Items> 
    </Picker> 
    <Label x:Name="PickerLabel" Text="Tap to Select Picker" FontSize="14" HorizontalOptions="Start"> 
     <Label.GestureRecognizers> 
      <TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped"/> 
     </Label.GestureRecognizers> 
    </Label> 

만들기 MainPage.xaml.cs를이 안드로이드와 IOS에 대한 문제를 해결

private void PickerList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     PickerLabel.Text = PickerList.Items[PickerList.SelectedIndex]; 
     // PickerLabel.Text = PickerList.SelectedItem.ToString() ; 
    } 

    private void TapGestureRecognizer_Tapped(object sender, EventArgs e) 
    { 
     PickerList.Focus(); 
    } 

파일.

-3

옵션은 스케일을 사용할 수 있습니다. 예를 들어, XAML에서 :

서체를 변경하는
<Picker Scale="0.5"> 
     <Picker.Items> 
     <x:String>Red</x:String> 
     <x:String>Blue</x:String> 
     <x:String>Green</x:String> 
     </Picker.Items> 
</Picker> 
0

, 크기, 밑줄, 텍스트, 텍스트 색상, 경고 대화 버튼 위치 (폼 선택기 자 마린) 안드로이드 네이티브 numberpicker에서 버튼 텍스트, 당신은 렌더링 사용자 정의로 처리 할 수 ​​있습니다 like :

using System; 
using System.Collections.Generic; 
using System.Text; 
using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Xamarin.Forms; 
using Xamarin.Forms.Platform.Android; 
using Android.Graphics.Drawables; 
using Android.Graphics; 

[assembly: ExportRenderer(typeof(Picker), typeof(MyPickerRenderer))] 
namespace Daddy.Droid 
{ 
    public class MyPickerRenderer : Xamarin.Forms.Platform.Android.PickerRenderer 
    { 
     Typeface fontFace = null; 
     private IElementController ElementController => Element as IElementController; 
     private AlertDialog _dialog; 
     public MyPickerRenderer(Context context) : base(context) 
     { 
      AutoPackage = false; 
     } 
     [Obsolete("This constructor is obsolete as of version 2.5. Please use PickerRenderer(Context) instead.")] 
     public MyPickerRenderer() 
     { 
      AutoPackage = false; 
     } 
     protected override void OnElementChanged(ElementChangedEventArgs<Picker> e) 
     { 
      base.OnElementChanged(e); 

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

      fontFace = Typeface.CreateFromAsset(this.Context.Assets, "somefont.ttf"); 

      GradientDrawable gd = new GradientDrawable(); 
      gd.SetStroke(0, Android.Graphics.Color.Transparent); 
      Control.SetBackground(gd); 

      Control.TextSize = 14f; 
      Control.SetTypeface(fontFace, TypefaceStyle.Normal); 

      Control.Click += Control_Click; 
     } 
     protected override void Dispose(bool disposing) 
     { 
      Control.Click -= Control_Click; 
      base.Dispose(disposing); 
     } 

     private void Control_Click(object sender, EventArgs e) 
     { 
      Picker model = Element; 
      NumberPicker picker = new NumberPicker(Context); 

      int count = picker.ChildCount; 
      for (int i = 0; i < count; i++) 
      { 
       Android.Views.View v = picker.GetChildAt(i); 
       if(v.GetType() == typeof(EditText)) 
       { 
        Java.Lang.Reflect.Field field = picker.Class.GetDeclaredField("mSelectorWheelPaint"); 
        field.Accessible = true; 
        ((Paint)field.Get(picker)).SetTypeface(fontFace); 
        ((EditText)v).SetTypeface(fontFace, TypefaceStyle.Normal); 
        picker.Invalidate(); 
       } 
      } 

      if (model.Items != null && model.Items.Any()) 
      { 
       picker.MaxValue = model.Items.Count - 1; 
       picker.MinValue = 0; 
       picker.SetDisplayedValues(model.Items.ToArray()); 
       picker.WrapSelectorWheel = false; 
       picker.DescendantFocusability = DescendantFocusability.BlockDescendants; 
       picker.Value = model.SelectedIndex; 
       picker.Visibility = ViewStates.Visible; 

      } 


      var layout = new LinearLayout(Context) { Orientation = Orientation.Vertical }; 
      layout.Visibility = ViewStates.Visible; 
      layout.AddView(picker); 


      ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty, true); 

      var builder = new AlertDialog.Builder(Context); 
      builder.SetView(layout); 

      builder.SetTitle(model.Title ?? ""); 

      builder.SetNegativeButton("Cancel", (s, a) => 
      { 
       ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty, false); 
       Control?.ClearFocus(); 
       _dialog = null; 
      }); 

      builder.SetPositiveButton("This One", (s, a) => 
      { 
       ElementController.SetValueFromRenderer(Picker.SelectedIndexProperty, picker.Value); 
       if (Element != null) 
       { 
        if (model.Items.Count > 0 && Element.SelectedIndex >= 0) 
         Control.Text = model.Items[Element.SelectedIndex]; 
        ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty, false); 
        Control?.ClearFocus(); 
       } 
       _dialog = null; 
      }); 

      _dialog = builder.Create(); 

      _dialog.DismissEvent += (ssender, args) => 
      { 
       ElementController?.SetValueFromRenderer(VisualElement.IsFocusedProperty, false); 
      }; 
      _dialog.Show(); 


      Android.Widget.Button nbutton = _dialog.GetButton((int)Android.Content.DialogButtonType.Positive); 
      nbutton.SetTypeface(fontFace, TypefaceStyle.Normal); 
      nbutton.SetTextColor(Android.Graphics.Color.ParseColor("#33b5e5")); 
      nbutton.TextSize = 16f; 
      LinearLayout layOut = (LinearLayout)nbutton.Parent; 
      layOut.SetGravity(GravityFlags.CenterHorizontal); 
      Android.Views.View v1 = layOut.GetChildAt(1); 
      v1.Visibility = ViewStates.Gone; 


      int res = Resources.GetIdentifier("alertTitle", "id", "android"); 
      TextView textView = (TextView)_dialog.FindViewById(res); 
      textView.SetTextColor(Android.Graphics.Color.Gray); 
      textView.SetTypeface(fontFace, TypefaceStyle.Normal); 
      textView.Gravity = GravityFlags.Center; 

     } 
    } 
} 
+0

스택 오버플로에 오신 것을 환영합니다! 질문은 글꼴 색 및 피커의 크기에 대해서만 물었고 다른 것들에 대해서는 묻지 않았습니다. 또한 [이 기사를 읽으십시오.] (https://stackoverflow.com/help/how-to-answer) - 코드 전용 답변은 일반적으로 여기에 답하는 가장 최적의 방법이 아닙니다. 개별 속성이나 메소드를 참조하거나 개별 메소드를 예로 든 경우 괜찮습니다. –

관련 문제