我为Android中的自定义布局扩展了Page.class。我有2个 问题。
我的自定义页面像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?它 是第一个问题。
我在PageRenderer中放大了自定义布局,并将Content Element放入
新的布局,但这是行不通的。 [程序集:ExportRenderer(typeof(DynamicScrollPage),
typeof(CoordinatorPageRenderer))]命名空间BibleHymn.Droid { } _view.AddView(list);它打印出异常
异常内容:它已经具有父对象,因此我应该先removeView()。但是此本地控件没有父级
ViewGroup。为什么本机控件无法在新布局中注册?
这是第二个问题。 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 >
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);