2016-04-08 8 views
3

Ich implementiere ein Xamarin.Forms-Steuerelement. Das Problem, das ich gerade erfahre, ist, dass eine überschriebene Draw() Methode eines benutzerdefinierten Renderers die Benutzeroberfläche blockiert (zumindest für die iOS-Plattform). Ich habe gegoogelt, aber ohne Erfolg. Ist es möglich, die Zeichnung im Hintergrund auszuführen, ohne die Benutzeroberfläche zu blockieren?Überschrieben Draw-Methode der ViewRenderer-Blöcke UI

Hier ist der Code eines einfachen Renderers für iOS-Plattform, die das Problem veranschaulicht.

public class MyCustomRenderer : ViewRenderer 
{ 
    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     base.OnElementPropertyChanged(sender, e); 
     SetNeedsDisplay(); 
    } 

    public override void Draw(CoreGraphics.CGRect rect) 
    { 
     var myControl = (MyControl)this.Element; 

     if (!myControl.IsRendered) 
     { 
     using (var context = UIGraphics.GetCurrentContext()) 
     { 
      var token = CancellationToken.None; 
      var task = Task.Factory.StartNew(() => TimeConsumingRendering(context, token), token); 

      // task.Wait() blocks the UI but draws the desired graphics. 
      // When task.Wait() is commented out = the desired graphics doesn't get drawn and it doesn't block the UI 
      task.Wait(); 
     } 
     } 
    } 

    private void TimeConsumingRendering(CGContext context, CancellationToken token) 
    { 
     try 
     { 
     for (int i = 0; i <= 100; i++) 
     { 
      token.ThrowIfCancellationRequested(); 
      var delay = Task.Delay(50); 
      delay.Wait(); 
     } 

     context.ScaleCTM(1f, -1f); 
     context.TranslateCTM(0, -Bounds.Height); 
     context.SetTextDrawingMode(CGTextDrawingMode.FillStroke); 
     context.SelectFont("Helvetica-Bold", 16f, CGTextEncoding.MacRoman); 
     context.SetFillColor(new CoreGraphics.CGColor(1f, 0f, 0f)); 
     context.ShowTextAtPoint(0, 0, "Finished"); 
     } 
     catch 
     { } 
    } 
} 

Antwort

0

Sieht so aus, dass die einzige Lösung dafür ist, das zeitaufwendige Zeichnen und Zeichnen auf der tatsächlichen Steuerung zu trennen.

Die Lösung ist

  1. ein Bild in einem Hintergrund zu erzeugen (durch ein Ereignis ausgelöst). und nur dann innerhalb der Draw-Methode.
  2. , um das generierte Bild innerhalb der überschriebenen Draw-Methode zu verwenden.

Zumindest funktioniert es für mich.

Verwandte Themen