2017-09-14 68 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

相關問題