2017-07-18 65 views
0

我有一個Xamarin.Forms應用程序,它在CarouselView中顯示一個ViewFlipper(https://github.com/TorbenK/ViewFlipper)。如何訪問CarouselView內部的對象Xamarin.Forms

我希望ViewFlipper在旋轉木馬內更換頁面時翻轉回到前面。但我似乎無法弄清楚如何訪問ViewFlipper。

我有以下工作代碼:

public class CarouselContent 
{ 
    public string FrontImg { get; set; } 
    public string BackImg { get; set; } 
} 

public class MainPage : ContentPage 
{ 
    public MainPage() 
    { 
     var pages = new ObservableCollection<CarouselContent>(); 

     var page1 = new CarouselContent(); 
     page1.FrontImg = "page1Front"; 
     page1.BackImg = "page1Back"; 

     var page2 = new CarouselContent(); 
     page2.FrontImg = "page2Front"; 
     page2.BackImg = "page2Back"; 

     pages.Add(page1); 
     pages.Add(page2); 

     var carouselView = new Carousel(pages); 

     Content = carouselView; 
    } 
} 

public class Carousel : AbsoluteLayout 
{ 
    private DotButtonsLayout dotLayout; 
    private CarouselView carousel; 

    public Carousel(ObservableCollection<CarouselContent> pages) 
    { 
     carousel = new CarouselView(); 

     var template = new DataTemplate(() => 
     { 
      //create page 
      var absLayout = new AbsoluteLayout(); 

      //create images for the flipper 
      var frontImg = new Image 
      { 
       Aspect = Aspect.AspectFit 
      }; 
      frontImg.SetBinding(Image.SourceProperty, "FrontImg"); 

      var backImg = new Image 
      { 
       Aspect = Aspect.AspectFit 
      }; 
      backImg.SetBinding(Image.SourceProperty, "BackImg"); 

      //create flipper 
      var flipper = new ViewFlipper.FormsPlugin.Abstractions.ViewFlipper(); 
      flipper.FrontView = frontImg; 
      flipper.BackView = backImg;    

      //Add flipper to page 
      absLayout.Children.Add(flipper); 

      return absLayout; 
     }); 

     carousel.ItemsSource = pages; 
     carousel.ItemTemplate = template; 

     Children.Add(carousel); 
    } 
} 

我嘗試添加了ViewFlipper到CarouselContent但我無法得到那個工作。有任何想法嗎?

編輯:

我試圖與可綁定項創建AbsoluteLayout並結合在CarouselContent在輪播視圖的DataTemplate中創建的項目,但線「(B作爲BindableAbsLayout).Children.Add((查看)ν );」在BindableAbsLayout中永遠不會被調用。我究竟做錯了什麼?

class BindableAbsLayout : AbsoluteLayout 
{ 
    public static readonly BindableProperty ItemsProperty = 
     BindableProperty.Create(nameof(Items), typeof(ObservableCollection<View>), typeof(BindableAbsLayout), null, 
      propertyChanged: (b, o, n) => 
      { 
       (n as ObservableCollection<View>).CollectionChanged += (coll, arg) => 
       { 
        switch (arg.Action) 
        { 
         case NotifyCollectionChangedAction.Add: 
          foreach (var v in arg.NewItems) 
           (b as BindableAbsLayout).Children.Add((View)v); 
          break; 
         case NotifyCollectionChangedAction.Remove: 
          foreach (var v in arg.NewItems) 
           (b as BindableAbsLayout).Children.Remove((View)v); 
          break; 
        } 
       }; 
      }); 

    public ObservableCollection<View> Items 
    { 
     get { return (ObservableCollection<View>)GetValue(ItemsProperty); } 
     set { SetValue(ItemsProperty, value); } 
    } 
} 


public class CarouselContent 
{ 
    private ViewFlipper.FormsPlugin.Abstractions.ViewFlipper _flipper; 
    private ObservableCollection<View> _items; 

    public ObservableCollection<View> Items 
    { 
     get { return _items; } 
    } 

    public CarouselContent(string frontImgStr, string backImgStr) 
    { 
     _items = new ObservableCollection<View>(); 

     _flipper = new ViewFlipper.FormsPlugin.Abstractions.ViewFlipper(); 

     var frontImg = new Image 
     { 
      Aspect = Aspect.AspectFit 
     }; 
     frontImg.Source = frontImgStr; 

     var backImg = new Image 
     { 
      Aspect = Aspect.AspectFit 
     }; 
     backImg.Source = backImgStr; 

     _flipper.FrontView = frontImg; 
     _flipper.BackView = backImg; 

     AbsoluteLayout.SetLayoutBounds(_flipper, new Rectangle(0.5, 0.05, 0.85, 0.85)); 
     AbsoluteLayout.SetLayoutFlags(_flipper, AbsoluteLayoutFlags.All); 

     Items.Add(_flipper); 
    } 
} 


public class Carousel : AbsoluteLayout 
{ 
    private DotButtonsLayout dotLayout; 
    private CarouselView carousel; 

    public Carousel(ObservableCollection<CarouselContent> pages) 
    { 
     carousel = new CarouselView(); 

      var template = new DataTemplate(() => 
      { 
       var absLayout = new BindableAbsLayout(); 
       absLayout.BackgroundColor = Color.FromHex("#68BDE4"); 
       absLayout.SetBinding(BindableAbsLayout.ItemsProperty,"Items"); 
       return absLayout; 
      }); 

     carousel.ItemsSource = pages; 
     carousel.ItemTemplate = template; 

     Children.Add(carousel); 
    } 
} 
+0

爲什麼不使用數據綁定控件視圖狀態的腳蹼? – 2017-09-10 21:50:29

回答

0

不知道最好的做法是什麼在這裏,但你可以嘗試通過ItemSelected事件訪問它(這觸發每次更換來回在輪播畫面時)

電線它

carousel.ItemSelected += carouselOnItemSelected; 

讓您ViewFlipper

private void carouselOnItemSelected(object sender, SelectedItemChangedEventArgs selectedItemChangedEventArgs) 
     { 
      CarouselContent carouselContent = selectedItemChangedEventArgs.SelectedItem; 
      ViewFlipper viewFlipper = carouselContent.Children[0]; 
      viewFlipper.FlipState = ViewFlipper.FrontView; 
     } 
+0

carouselContent不包含'Children'的定義 – wkeuning