2016-10-02 6 views
0

In meiner Xamarin.Forms App möchte ich das Aussehen und Verhalten von Schaltflächen in einem höheren Grad als zulässig anpassen, also verwende ich einen benutzerdefinierten Renderer, um das Standardsteuerelement in Xamarin zu ersetzen .Forms auf Windows Phone 8.1 mit meinem eigenen Button-Steuerelement.Weiterleiten von Ereignissen/Befehlen bei Verwendung von Xamarin.Forms Benutzerdefinierte Renderer

Meine Kontrolle, die nur Button erweitert, wird später zusätzliche Eigenschaften hinzufügen.

public class ButtonControl : Button {} 

Meine benutzerdefinierten Renderer auf Windows Phone 8.1:

public class ButtonControlRenderer : ViewRenderer<ButtonControl, Button> 
    { 
    protected override void OnElementChanged(ElementChangedEventArgs<ButtonControl> e) 
    { 
     base.OnElementChanged(e); 

     if (e.OldElement != null || Element == null) 
     return; 

     var button = new Button 
     { 
     Style = Application.Current.Resources["ButtonWithTilt"] as Style, 
     Content = Element.Text, 
     IsEnabled = Element.IsEnabled 
     }; 

     Element.BackgroundColor = Color.Transparent; 

     SetNativeControl(button); 
    } 
    } 

Und, wie ich die Kontrolle in der Xamarin.Forms XAML-Datei bin mit:

<StackLayout VerticalOptions="Center" 
         HorizontalOptions="Fill" 
         Margin="24,12,24,0"> 
       <controls:ButtonControl Text="{res:Translate LoginPageButtonText}" 
         TextColor="{x:Static const:Colours.OverlayColor}" 
         BackgroundColor="{x:Static const:Colours.PrimaryColor}" 
         BorderWidth="0" 
         Margin="0,24,0,0" 
         HeightRequest="50" 
         IsEnabled="{Binding LoginValid}" 
         Command="{Binding LoginCommand}" 
         StyleId="{x:Static const:StyleIds.LoginPageButton}"/> 
      </StackLayout> 

Wie ich bin Wenn ich die Schaltfläche auswähle, funktionieren meine Befehle nicht out-of-the-box. Ich muss Folgendes in OnElementChanged hinzufügen, damit beim Klicken auf die neue Schaltfläche der Befehl ausgeführt wird:

button.Tapped += delegate 
     { 
     Element.Command.Execute(null); 
     }; 

Dies scheint nicht die sauberste Lösung zu sein, gibt es eine bessere Möglichkeit, dies zu erreichen?

Auch, wenn es ein Ereignis gab, wollte ich auf der Basis Xamarin.Forms Kontrolle auslösen, wie Clicked, wie würde ich darüber gehen? Würde ich das Clicked-Ereignis in meinem ButtonControl überschreiben, statt es von der Button-Klasse zu übernehmen und eine Methode hinzufügen, um das Ereignis von dort auszulösen?

Antwort

1

button.Tapped += handler ist die Art, wie Sie es tun. Aber anstatt den Befehl auszuführen, müssen Sie nur SendClicked() auf Ihrem Element aufrufen. Dadurch wird der Befehl und das Ereignis Clicked auslösen. Die Standard-Renderer machen das gleiche.

Sie sollten den anonymen Delegaten in eine Methode in Ihrer Klasse transformieren, um das Ereignis beim Bereinigen aufheben zu können, um Speicherlecks zu vermeiden.

+0

Perfekt, vielen Dank, suchte nach einer Methode, aber war nicht zu IButtonController Casting so nie gefunden. Guter Tipp über Entsorgung! –

Verwandte Themen