2016-10-02 7 views
0

私のXamarin.Formsアプリケーションでは、Xamarinのデフォルトコントロールを置き換えるために、カスタムレンダラーを使用しているため、ボタンの外観をカスタマイズする必要があります。自分のボタンコントロールを持つWindows Phone 8.1の.FormsXamarin.Formsカスタムレンダラー使用時のイベント/コマンドの転送

Buttonを拡張するだけのコントロールは、後で追加のプロパティを追加します。

public class ButtonControl : Button {} 

のWindows Phone 8.1のマイカスタムレンダラ:私はのよう

<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> 

:私はXamarin.FormsのXAMLファイル内のコントロールを使用していますか

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); 
    } 
    } 

をそして、ボタンを置き換えると、私のコマンドは機能しません.OnElementChangedに次のコードを追加すると、新しいボタンがクリックされたときにコマンドが実行されます。

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

これは最もクリーンなソリューションのようではありませんが、これを接続するより良い方法はありますか?

また、Clickedのような基本的なXamarin.Formsコントロールでイベントを発生させたい場合はどうすればよいですか? ButtonControlのClickedイベントを、Buttonクラスから継承し、そこからイベントをトリガするメソッドを追加するよりもオーバーライドしますか?

答えて

1

button.Tapped += handlerです。しかし、コマンドを実行する代わりに、エレメント上でSendClicked()に電話するだけで済みます。コマンドが実行され、Clickedイベントが発生します。標準のレンダラも同じことをしています。

匿名デリゲートをクラス内のメソッドに変換して、メモリリークを防ぐために、クリーンアップ時にイベントの登録を解除する必要があります。

public class ButtonControlRenderer : ViewRenderer<ButtonControl, Button> 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<ButtonControl> e) 
    { 
     //your creation code ...    
     button.Tapped += OnButtonTapped; 
    } 

    private void OnButtonTapped(...) 
    { 
     ((IButtonController)Element)?.SendClicked(); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (Control != null) 
      Control.Tapped -= OnButtonTapped; 

     base.Dispose(disposing); 
    } 
} 
+0

非常にありがたいことに、メソッドを探していましたが、IButtonControllerにキャストしていないので見つからなかったためです。 処分についてのヒント –

関連する問題