2017-09-14 19 views
9

Android上的Xamarin.Forms。点击选择器打开对话框,反面按钮的默认文本为“取消”。我该如何改变它?Xamarin形式选择器上android更改取消文本

我看了Xamarin的开源项目,他们设置了积极的按钮上的文字是这样

builder.SetNegativeButton(global::Android.Resource.String.Cancel, (s, a) => ... 

该方法是私有的,所以我不能覆盖类方法。

无论是我可以复制粘贴执行这一类的,因为它的成员是私有的Xamarn DLL-S ...

链接到Xamarin.Forms该选择器实现andoid:

https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs

+1

提交拉请求 – Jason

+0

并替换代码?并将其包含在我的项目中而不是xamarin nuget包中? –

+0

你可以使用你自己的渲染器吗?只是差不多从Xamarin复制实现,并将其扩展为有更改文本的方法。 – tjugg

回答

3

Xamarin形式选择器上的android更改取消文本

作为替代选择,你可以重写你的PickerRenderer整个对话:

public class MyPickerRenderer : Xamarin.Forms.Platform.Android.PickerRenderer 
{ 
    private IElementController ElementController => Element as IElementController; 
    private AlertDialog _dialog; 

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

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

     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; 

     var picker = new NumberPicker(Context); 
     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; 
     } 

     var layout = new LinearLayout(Context) { Orientation = Orientation.Vertical }; 
     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); 
      // It is possible for the Content of the Page to be changed when Focus is changed. 
      // In this case, we'll lose our Control. 
      Control?.ClearFocus(); 
      _dialog = null; 
     }); 
     builder.SetPositiveButton("Ok 0.0", (s, a) => 
     { 
      ElementController.SetValueFromRenderer(Picker.SelectedIndexProperty, picker.Value); 
      // It is possible for the Content of the Page to be changed on SelectedIndexChanged. 
      // In this case, the Element & Control will no longer exist. 
      if (Element != null) 
      { 
       if (model.Items.Count > 0 && Element.SelectedIndex >= 0) 
        Control.Text = model.Items[Element.SelectedIndex]; 
       ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty, false); 
       // It is also possible for the Content of the Page to be changed when Focus is changed. 
       // In this case, we'll lose our Control. 
       Control?.ClearFocus(); 
      } 
      _dialog = null; 
     }); 

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

Effect

相关问题