2017-07-18 42 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