2015-03-28 11 views
5

में कस्टम पिकर बनाने का प्रयास कर रहा हूं, मैं 3 घटकों के साथ एक कस्टम पिकर बनाने की कोशिश कर रहा हूं। मैंने Xamarin साइट here पर ट्यूटोरियल का पालन किया। मुझे काम करने के लिए नियंत्रण मिला, सिवाय जब मैं पिकर पर पूर्ण बटन क्लिक करता हूं (यह डिफ़ॉल्ट किया गया बटन है)। मुझे निम्न अपवाद मिलता है:Xamarin फॉर्म

सिस्टम। इन्वालिड कैस्ट अपवाद: 'xproarin.Forms.Platform.iOS.PickerRenderer + PickerSource' टाइप करने के लिए 'myproj.iOS.MyPickerModel' प्रकार का ऑब्जेक्ट डालने में असमर्थ।

साझा proj में:

public class MyPicker: Picker {} 

आईओएस proj में:

[assembly: ExportRenderer(typeof(MyPicker), typeof(MyPickerRenderer))] 

public class MyPickerRenderer: PickerRenderer 
{ 
    // Override the OnElementChanged method so we can tweak this renderer post-initial setup 
    protected override void OnElementChanged(ElementChangedEventArgs<Picker> e) 
    { 
     base.OnElementChanged(e); 

     if (Control != null) 
     { 
      var picker = (UIPickerView)this.Control.InputView; 
      picker.BackgroundColor = UIColor.White; 
      picker.Model = new MyPickerModel(); 
     } 

और मॉडल:

public class MyPickerModel : UIPickerViewModel 
{ 
    private string[] array1 = new string [] { 
     "1","2","3","4" 
    }; 
    private string[] array2 = new string [] { 
     "1a","2a","3a","4a" 
    }; 

    private string[] array3 = new string [] { 
     "a","b","c","d" 
    }; 

    public override nint GetComponentCount (UIPickerView pickerView) 
    { 
     return 3; 
    } 

    public override nint GetRowsInComponent (UIPickerView pickerView, nint component) 
    { 
     // Returns 
     switch (component) { 
      case 0: return array1.Length; 
      case 1: return array2.Length; 
      case 2: return array3.Length; 
      default:break; 
     } 
     return 0; 
    } 

    public override string GetTitle (UIPickerView pickerView, nint row, nint component) 
    { 
     // Returns 
     switch (component) 
     { 
      case 0: return array1[row]; 
      case 1: return array2[row]; 
      case 2: return array3[row]; 
      default: break; 
     } 
     return null; 
    } 

    public override nfloat GetComponentWidth (UIPickerView pickerView, nint component) 
    { 
     switch (component) 
     { 
      case 0: return 100.0f; 
      case 1: return 100.0f; 
      case 2: return 100.0f; 
      default: break; 
     } 

     return 0; 
    } 

    public override nfloat GetRowHeight (UIPickerView pickerView, nint component) 
    { 
     return 40f; 
    } 
} 

और अंत में

यहाँ मेरी कोड है मेरा पृष्ठ:

public class MyPage : ContentPage 
{ 
    public MyPage() 
    { 
     MyPicker picker = new MyPicker 
     { 
      Title = "Color", 
      VerticalOptions = LayoutOptions.CenterAndExpand 
     }; 

     picker.SelectedIndexChanged += (sender, args) => 
     { 

     }; 

     var mainLayout = new StackLayout 
     { 
      Orientation = StackOrientation.Vertical, 
      Children = 
      { 
       picker 

      } 
     }; 


     // Accomodate iPhone status bar. 
     this.Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, 0); 
     this.BackgroundImage = "background.png"; 

     // Build the page. 
     this.Content = mainLayout; 
    } 
} 

मुझे समझ नहीं आता क्यों अपने PickerRenderer + PickerSource को MyPickerModel कास्ट करने के लिए

धन्यवाद की कोशिश कर रहा!

उत्तर

1

लेकर सुनिश्चित नहीं हैं आईओएस काम करता है, लेकिन मेरे Android संस्करण की तरह लग रहा से पता चलता है कि तुम क्या जरूरत है:

[assembly: ExportRenderer(typeof(BaseBindablePicker), typeof(SimpleEID.Android.Shared.CustomRender.AndroidPicker))] 

public class AndroidPicker : PickerRenderer 
{  
    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Picker> e) 
    { 
     base.OnElementChanged(e); 

     var pick = (BaseBindablePicker)this.Element; 
     this.Control.SetBackgroundColor(pick.BackColor.ToAndroid()); 
    } 
} 
:

public class BaseBindablePicker : Picker 
{ 
    public static readonly BindableProperty BackgroundColor= 
    BindableProperty.Create<BaseBindablePicker, Color>(p => p.BackgroundColor, Color.Default); 

    public Color ColorBackground 
    { 
     get { return (Color)base.GetValue(BackgroundColor); } 
     set { base.SetValue(BackgroundColor, value); } 
    } 
} 

मेरे मंच विशेष दृश्य दिखाई देता है:

मेरे basePicker इस तरह दिखता है

मूल रूप से लग रहा है यू की तरह अपने

var picker = (UIPickerView)this.Control.InputView; 
बदलने की जरूरत है

होने की

var picker = (MyPicker)this.Element; 

तो बस refence आप क्या वहाँ से की जरूरत हो सकता है आपके मॉडल के लिए एक संदर्भ जोड़ने

4

आपने लगभग ... बस UIPickerView का एक नया उदाहरण बनाने थे, अपने कस्टम आवंटित मॉडल (MyPickerModel) इसके लिए और उसके बाद UIPickerViewControl.InputView असाइन करें। OnElementChanged आपके रेंडरर में ऐसा दिखाई देगा:

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

    if (Control != null) 
    { 
     var myPickerModel = new MyPickerModel(); 
     var myPickerView = new UIPickerView 
     { 
      Model = myPickerModel 
     }; 
     //Assign your picker view 
     Control.InputView = myPickerView; 

     //You can also create an event in your model to react on user actions like e.g. "SelectedValueChanged"... 
     myPickerModel.SelectedValueChanged += (sender, eventArgs) => 
     { 
      //...to set the selected value as title of the picker element 
      e.NewElement.Title = myPickerModel.SelectedValue; 
     }; 
    } 
}