2015-03-20 4 views
2

Я пытаюсь создать пользовательский элемент управления. Ниже мой кодXamarin Forms Custom renderer ios

public class BoxControlRenderer:ViewRenderer<BoxControl,BoxControlView> 
    { 
     BoxControlView boxControlView; 

     protected override void OnElementChanged (ElementChangedEventArgs<BoxControlView> e) 
     { 
      base.OnElementChanged (e); 
      this.lineControlView = new BoxControlView (this.Bounds); 
      this.SetNativeControl(this.boxControlView); 
     } 


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

      if (e.PropertyName == BoxControlView.BoxControlProperty.PropertyName) 
      { 
       this.boxControlView.BoxControlProperty = this.Element.CheckedValue; 
      } 
     } 

    } 

Мои BoxControlView Вид:

[Register("BoxControlView")] 
    public class BoxControlView :UIView 
    { 
     UIImageView imageView; 

     BoxControl _control; 

     [Export("initWithFrame:")] 
     public BoxControlView(CGRect bounds) 
      : base(bounds) 
     { 
      imageView = new UIImageView (new CGRect (0, 0, 40, 18)); 
     } 

     private bool _boxControlProperty; 

     public bool BoxControlProperty 
     { 
      get { 
       return _boxControlProperty; 
       } 
      set{ 
       value = _boxControlProperty; 
       OnPropertyChanged ("BoxControlProperty"); 
       SetNeedsDisplay(); 

      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
       handler (this, new PropertyChangedEventArgs (propertyName)); 
     } 

     public override void Draw (CoreGraphics.CGRect rect) 
     { 
      base.Draw (rect); 

      this.BackgroundColor = UIColor.Green; 

      BoxControlProperty = _control.CheckedValue; 

      Action OnImageViewTapped =() => { 
       if(BoxControlProperty) 
        imageView.Image = UIImage.FromFile("test1.png"); 
       else 
        imageView.Image = UIImage.FromFile("test2.png"); 
      }; 

      var tapGesture = new UIGestureRecognizer(); 
      tapGesture.AddTarget (OnImageViewTapped); 
      imageView.AddGestureRecognizer (tapGesture); 
     } 
    } 

BoxControl:

public class BoxControl :View 
    { 

     public static readonly BindableProperty BoxControlProperty = BindableProperty.Create<BoxControl, bool>(z=>z.CheckedValue,false); 

     public bool CheckedValue 
     { 
      get{ 
       return (bool)GetValue (BoxControlProperty); 
      } 
      set{ 
       SetValue (BoxControlProperty, value); 
      } 
     } 

    } 

В приведенном выше коде метод OnDraw не вызывался. Во время отладки аварии Xamarin Studio, если держать любую точку останова в

protected override void OnElementChanged (ElementChangedEventArgs<CheckBoxControl> e) method or Draw method. 

ответ

1

У вас есть экспортная линия DependencyService в верхней части файла визуализатора?

Аналогично:

[assembly: ExportRenderer (typeof (BoxControl), typeof (BoxControlRenderer))] 

Я не вижу его там, так что я должен спросить. Опять же, я еще не использовал самую последнюю версию Xamarin.Forms (1.3). Вот как я сделал собственные рендереры для образца проекта: http://www.joesauve.com/using-xamarin-auth-with-xamarin-forms/. Посмотрите раздел iOS примерно на 1/3 пути вниз по странице.