2016-11-03 21 views
5

Uygulamamda çalışan bir ana ayrıntı sayfası var. Ana sayfayı açmak için kullanılan standart yöntem, burger menü simgesini seçmek veya soldan kaydırmaktır. Ayrıntı sayfalarımdan biri, bir karusel sayfası kullanmaktır. Soldan kaydırma, bu nedenle ya ana sayfayı açabilir ya da atlı kareyi sola kaydırabilir (yanlış bir olay meydana geldiğinde rahatsız edici olabilir).MasterDetailPage Ana sayfa IsGestureEnabled ile açılmıyor false olarak ayarlandı Xamarin.Forms Android

Soldan kayarken ana sayfanın görünmesini durdurmak için IsGestureEnabled öğesini false olarak ayarlıyorum. Ancak bu, Ana Sayfa'nın hiç görünmesini engeller. Burger menü simgesine basarken haptik geri bildirimlerine rağmen, hiçbir şey yapmıyor.

Bir MasterDetailPage'de kaydırma hareketini yok saymanın ve simgesindeki dokunma hareketini zorlamanın bir yolu var mı?

MasterDetailPage ve IsGestureEnabled öğesi false değerine ayarlanmış çok basit bir uygulama. Ana sayfa açılmayacak. https://www.dropbox.com/s/rkm5eph3vr38avm/MasterDetailPageTest.zip?dl=0

+0

Varsayılan Oluşturucu davranışı geçersiz olurdu: https://github.com/xamarin/Xamarin.Forms/blob/74cb5c4a97dcb123eb471f6b1dffa1267d0305aa/Xamarin .Forms.Platform.Android/Renderers/MasterDetailRenderer.cs # L287 (Normal)/https://github.com/xamarin/Xamarin.Forms/blob/d178a458ee1cdae63e1ffaf6f5445000f7b9cd0e/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs# L313 (AppCompat) –

+0

@JonDouglas, bundan korktum. İlham alabilmem için bu tür davranışların geçersiz kılındığı bir örneğini bilmek mümkün olmaz mıydı? –

+0

Bildiğim kadarıyla değil. Belki başkası biliyordur. –

cevap

1

MasterDetailPage için özel oluşturucu oluşturarak bir geçici çözüm buldum. Şimdilik ihtiyaçlarıma uymalı.

[assembly: ExportRenderer(typeof(MyMasterDetailPage), typeof(MyMasterDetailPageRenderer))] 

Bu sorunu kökünden yok, ama artık kaydırarak zaman ana sayfa açılmaz:

public class MyMasterDetailPageRenderer : Xamarin.Forms.Platform.Android.AppCompat.MasterDetailPageRenderer 
{ 
    public override bool OnTouchEvent(MotionEvent e) 
    { 
     if (IsDrawerOpen(Android.Support.V4.View.GravityCompat.Start)) 
      return base.OnTouchEvent(e); 
     else 
     { 
      if (e.Action == MotionEventActions.Up || e.Action == MotionEventActions.Down) 
       return base.OnTouchEvent(e); 
      else 
      { 
       CloseDrawers(); 
       return true; 
      } 
     } 
    } 
} 

montaj hattı ad alanının dışına eklenmesi gerekir.

+0

Tam olarak aynı sorun var, ama çözümünüz iyi çalışmıyor gibi görünüyor. Bir simülatörde denedim ve eğer fareyi sol kenarlık üzerinde kaydırırsam, master açılır. Neyse, teşekkürler! –

+0

@ MarkO'Brian Kuşkusuz sadece 1 cihazda denedim (bu, cevabımı henüz kabul etmediğim bir sebepti). Xamarin'den aldığım bir e-posta, şu anda API'nın kaputun altında bir eser olduğu için bunu düzeltemeyeceğini gösteriyor. –

+0

Cevabınız için teşekkür ederiz! Ana sayfamda OnAppearing() ve masterDetailPage.IsGestureEnabled = false ayarını masterDetailPage.IsGestureEnabled = true olarak ayarlamamı çözdüm OnDisappearing(). Bu sayede, yalnızca ana sayfamda kaydırma özelliğini etkinleştirdim ve diğer tüm sayfalarda devre dışı bırakılmış. Bu biraz bir çözüm, ama neyse ki işe yarıyor! –

0

Richard'ın kod bazı değişikliklerle benim için çalışıyor

RootView page; 

    protected override void OnElementChanged(VisualElement oldElement, VisualElement newElement) { 
     base.OnElementChanged(oldElement, newElement); 
     page = newElement as RootView; 
    } 

    public override bool OnTouchEvent(MotionEvent e) { 
     if(IsDrawerOpen(Android.Support.V4.View.GravityCompat.Start)) 
      return base.OnTouchEvent(e); 
     else { 
      if((e.Action == MotionEventActions.Up || e.Action == MotionEventActions.Down || e.Action == MotionEventActions.Move) 
       && (page?.SwipeEnabled ?? false) 
      ) 
       return base.OnTouchEvent(e); 
      else { 
       CloseDrawers(); 
       return true; 
      } 
     } 
    }