2014-11-18 4 views
2

iOS에 렌더러 버튼이 있습니다. 내가하려고하는 것은 스 와이프 제스처가 생기면 스택에 다른 페이지를 트리거하는 것입니다.Xamarin 페이지를 렌더러에서 바꾸기 버튼

내 MainPage에서이를 구현하면 Clicked는 곧장 해결됩니다. "this"를 사용할 수 있기 때문에

public class MainPage : ContentPage 
    { 
     public MainPage() 
     { 
      // Button bottom 1 
      var button = new Button { 
       Text = "button", 
       HeightRequest = 60, 
       HorizontalOptions = LayoutOptions.FillAndExpand, 
       VerticalOptions = LayoutOptions.CenterAndExpand, 

      }; 
      button.Clicked += async (sender, e) => { 
       await this.Navigation.PushModalAsync(new nextPage()); 
      }; 
     } 
} 

그러나 iOS의 렌더링 된 버튼에서 어떻게 할 수 있습니까?

내 렌더러 버튼은 다음과 같이이다 :

public class MYButtonRenderer : ButtonRenderer 
    { 
     UISwipeGestureRecognizer swipeGestureRecognizerUp; 

     protected override void OnElementChanged (ElementChangedEventArgs<Button> e) 
     { 
      base.OnElementChanged (e); 

      swipeGestureRecognizerUp = new UISwipeGestureRecognizer (() => onSwipeUp()); 
      swipeGestureRecognizerUp.Direction = UISwipeGestureRecognizerDirection.Up; 

      if (e.NewElement == null) 
      { 

       if (swipeGestureRecognizerUp != null) 
       { 
        this.RemoveGestureRecognizer (swipeGestureRecognizerUp); 
       } 
      } 

      if (e.OldElement == null) 
      { 
       this.AddGestureRecognizer (swipeGestureRecognizerUp); 
      } 
     } 

     private void onSwipeUp() 
     { 
      //here it's where I would like to change the page to a new one. 
     } 
    } 

이 가능하다? 감사합니다.

답변

2

이렇게하는 좋은 방법은 사용자 지정 렌더러를 사용자 지정 단추보기와 결합하는 것입니다. 맞춤보기에는 구독 할 수있는 스 와이프 이벤트가있을 수 있습니다. 물론, 커스텀 이벤트 데이터를 전달하기 위해 필요하다면 커스텀 델리게이트를 만들 수도 있지만,이 예제를 단순하게 유지했습니다. 사용자 정의 렌더러에서

public class CustomButton : Button 
{ 
    public event EventHandler OnSwipeUp; 

    public void FireSwipeUp() 
    { 
     var swipeUp = OnSwipeUp; 
     if (swipeUp != null) 
      swipeUp(this, EventArgs.Empty); 
    } 
} 

, 당신은 FireSwipeUp 메소드를 호출하여 사용자 정의 이벤트가 발생 할 수 있습니다.

private void onSwipeUp() 
{ 
    ((CustomButton)Element).FireSwipeUp(); 
} 

지금 당신은 당신이 Clicked와 마찬가지로, 당신의 MainPage 클래스 내에서 정의 OnSwipeUp 이벤트를 구독 할 수 있습니다.

// Button bottom 1 
var button = new CustomButton { 
    Text = "button", 
    HeightRequest = 60, 
    HorizontalOptions = LayoutOptions.FillAndExpand, 
    VerticalOptions = LayoutOptions.CenterAndExpand, 
}; 

button.Clicked += async (sender, e) => { 
    await this.Navigation.PushModalAsync(new nextPage()); 
}; 

button.OnSwipeUp += async (sender, e) => { 
    await this.Navigation.PushModalAsync(new nextPage()); 
}; 
+0

답장을 보내 주셔서 감사합니다. 그러나 내 사용자 정의 단추 (단추보기) 및 내 단추를 내 단추가있는 경우 공유 프로젝트에서 사용자 지정 단추 유형 단추를 어떻게 가질 수 있는지 이해할 수 없습니다 내 단추 프로젝트 내 iOsProject. 내가 놓친 게 있니? – Loebre

+0

나는 당신이하려는 것을보고 있습니다. 나는 그것을 테스트 할 수 없기 때문에 나의 맥에 있지 않다. 그러나 나는 나의 대답을 편집했다. 이제 버튼은 Button에서 상속받습니다. 이는 공유 된 Xamarin.Forms 버튼 유형입니다. 이것을 공유 프로젝트에 넣을 수 있습니다. 렌더러의 Model 속성을 사용하여 공유 Xamarin.Forms 컨트롤에 액세스하도록 iOS 렌더러의 코드를 변경했습니다. 작동하는지 알려주세요. :) –

+0

이제 "((CustomButton) 모델) .FireSwipeUp();"에서 불평하고 있습니다. 이 문맥에 "모델"이 존재하지 않는다고 말합니다. 나는 다른 추악한 방식으로 작동하도록했습니다. 그러나 나는 당신이 제안하는 방식대로 그것을하고 싶습니다, 그것은 제 영리한 것보다 훨씬 영리합니다. – Loebre

관련 문제