如何将Xamarin Element放入Xamarin.Android中的自定义布局

时间:2019-01-13 03:12:42

标签: xamarin xamarin.forms xamarin.android

  • 我为Android中的自定义布局扩展了Page.class。我有2个 问题。

    1. 如何在页面中显示我的内容元素。
    2. 如何将Xaml上定义的内容移动到Pagerenderer中的另一个ViewGroup。

    我的自定义页面像ContentPage一样显示了ContentProperty。

命名空间测试 {
[ContentProperty(“ Content”)]
公共类CoordinatorPage:页面
{
公共CoordinatorPage(){}

公共静态只读BindableProperty ContentProperty = BindableProperty.Create(nameof(Content),typeof(Xamarin.Forms.View),    typeof(CoordinatorPage),null,propertyChanged:OnContentChanged);

       public Xamarin.Forms.View Content
       {
           get { return (Xamarin.Forms.View)GetValue(ContentProperty); }
           set { SetValue(ContentProperty, value); }
       }
       public static void OnContentChanged(BindableObject bindable, object oldValue, object newValue)
       {

           if(bindable != null )
           {

               Element newElement =(Element)newValue;
               SetInheritedBindingContext(newElement, bindable.BindingContext);
           }

       }

   } }

我将此CoordinatorPage继承到子Page(命名为    DynamicScrollPage)

并添加了subView,如下面的代码。

但未显示Listview。为什么页面没有在屏幕上显示ListView?它    是第一个问题。

            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:view="clr-namespace:Test.View"
            xmlns:vm="clr-namespace:Test.ViewModel"
            x:Class="Test.DynamicScrollPage" >

   <CoordinatorPage.BindingContext>
       <vm:TestViewModel></vm:TestViewModel>
   </CoordinatorPage.BindingContext>
    < CoordinatorPage.Content > <view:TestListView 
           x:Name="Lv"
           ListView.RowHeight="150"
           ItemsSource="{Binding List,Mode=OneWay}"      >

           <view:TestListView.ItemTemplate>
               <DataTemplate>
                   <ViewCell>
                       <StackLayout Orientation="Horizontal">
                           <Label Text="{Binding paragraph}" FontSize="Large" />
                           <Label Text="{Binding sentence}" FontSize="Large"/>

                       </StackLayout>
                   </ViewCell>
               </DataTemplate>
           </view:TestListView.ItemTemplate> </view:TestListView> < /CoordinatorPage.Content >
    < /CoordinatorPage >

我在PageRenderer中放大了自定义布局,并将Content Element放入    新的布局,但这是行不通的。

[程序集:ExportRenderer(typeof(DynamicScrollPage),    typeof(CoordinatorPageRenderer))]命名空间BibleHymn.Droid {

   public class CoordinatorPageRenderer : PageRenderer
   {
       Activity _activity;
       Android.Views.View _view;
       protected override void OnLayout(bool changed, int l, int t, int r, int b)
       {
           base.OnLayout(changed, l, t, r, b);
           var msw = MeasureSpec.MakeMeasureSpec(r - l, MeasureSpecMode.Exactly);
           var msh = MeasureSpec.MakeMeasureSpec(b - t, MeasureSpecMode.Exactly);
           _view.Measure(msw, msh);
           _view.Layout(0, 0, r - l, b - t);
       }

       public CoordinatorPageRenderer(Context context) : base(context)
       {
           _activity = this.Context as FormsAppCompatActivity;
           _view = _activity.LayoutInflater.Inflate(Resource.Layout.Coordinator, this, false);


       }
       protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Page> e)
       {

           if (Element == null) return;
           if (e.NewElement == null) return;



           _page = (DynamicScrollPage)Element;
           ListView list = ((ListViewRenderer)        Platform.CreateRendererWithContext(_page.ContentX,_activity)).Control
            _view.AddView(list);     //  It Throw exception. 
            AddView(_view);

}

_view.AddView(list);它打印出异常         异常内容:它已经具有父对象,因此我应该先removeView()。但是此本地控件没有父级    ViewGroup。为什么本机控件无法在新布局中注册?    这是第二个问题。

0 个答案:

没有答案