Force redraw of Xamarin.Forms View with custom renderer

前端 未结 2 681
小鲜肉
小鲜肉 2021-02-13 18:16

I have a visual element MyButton with a custom renderer implemented for iOS.

Shared:

namespace RendererTest
{
    public class MyButton: But         


        
相关标签:
2条回答
  • 2021-02-13 18:43

    Two modifications were required:

    1. Call OnPropertyChanged within the setter of the BoundaryColor property:

      public class MyButton: Button
      {
          Color boundaryColor = Color.Red;
      
          public Color BoundaryColor {
              get {
                  return boundaryColor;
              }
              set {
                  boundaryColor = value;
                  OnPropertyChanged();  // <-- here
              }
          }
      }
      
    2. Subscribe to the event within the OnElementChanged method of MyButtonRenderer:

      public class MyButtonRenderer: ButtonRenderer
      {
          protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
          {
              base.OnElementChanged(e);
              Element.PropertyChanged += (s_, e_) => SetNeedsDisplay();  // <-- here
          }
      
          public override void Draw(RectangleF rect)
          {
              // ...
          }
      }
      

    Note: It seems to be important to subscribe within OnElementChanged and not the constructor. Otherwise a System.Reflection.TargetInvocationException is raised.

    0 讨论(0)
  • 2021-02-13 18:52

    First, turn you BoundaryColor into a bindable property. That's not required, firing INPC event is enough, but then you can bind to it:

    public static readonly BindableProperty BoundaryColorProperty =
        BindableProperty.Create ("BoundaryColor", typeof(Color), typeof(MyButton), Color.Default);
    
    public Color BoundaryColor {
        get { return (Color)GetValue (BoudaryColorProperty); }
        set { SetValue (BoundaryColorProperty, value); }
    }
    

    then, in your renderer:

    protected override void OnElementPropertyChanged (object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged (sender, e);
    
        if (e.PropertyName == MyButton.BoundaryColorProperty.PropertyName)
            SetNeedsDisplay ();
    }
    
    0 讨论(0)
提交回复
热议问题