自定义ContentPageRenderer Android

时间:2018-01-29 12:05:29

标签: xamarin.forms renderer

我试图在Android中的自定义页面渲染器中将NavigationBar中的Button从右侧移动到左侧。 CropDetailPage是共享代码中的内容页面。

[assembly: ExportRenderer(typeof(CropDetailPage),typeof(CropDetailPageRenderer))]
namespace MyApp.Droid
{
public class CropDetailPageRenderer : PageRenderer
    {
        public CropDetailPageRenderer(Context context)
            : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
        {
            base.OnElementChanged(e);

            if (e.OldElement != null || Element == null)
            {
                return;
            }

            var bar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            bar.SetBackgroundColor(Android.Graphics.Color.Azure);
            // Only have 1 child
            bar.GetChildAt(0).SetX(10); 
        }
    }
}

当我尝试打开引用页面时,我收到此异常

  

System.Reflection.TargetInvocationException:调用目标抛出了异常。

我已尝试在OnElementChanged方法中对代码进行评论,但异常情况仍然存在,因此我知道它并非来自逻辑。

此外,这是自定义Toolbar外观的正确方法吗?由于我想将按钮向左移动,我只想更改X coordinate

对于发生了什么的任何想法?

编辑:按钮的Xaml

<ContentPage.ToolbarItems>
    <ToolbarItem Text="Back" Command="{Binding GoBackCommand}"></ToolbarItem>
</ContentPage.ToolbarItems>
<ContentPage.Content>
 ....
</ContentPage.Content>

1 个答案:

答案 0 :(得分:0)

  

我正在尝试将NavigationBar中的Button从右侧移动到左侧

如果您的Button位于Toolbar.axml,您可以更改Button的位置:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:popupTheme="@style/ThemeOverlay.AppCompat.Light">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
       <Button
           android:text="Button"
           android:layout_alignParentRight="true"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"/>
    </RelativeLayout>

</android.support.v7.widget.Toolbar>

更新

您可以参考我的answer

Herer是一个简单的解决方案,创建一张颜色与Toolbar相同的图片,在我的项目中,我的图片是blue.png

enter image description here

将其放在Toolbar的左侧,在图片和ToolbarItem之间添加一些空白ToolbarItem以调整空间。

<ContentPage.ToolbarItems>
    <ToolbarItem  Text="Button" Order="Primary" Priority="0"/>
    <ToolbarItem  Order="Primary" Priority="0" />
    <ToolbarItem  Order="Primary" Priority="0" />
    <ToolbarItem  Order="Primary" Priority="0" />
    <ToolbarItem  Order="Primary" Priority="0" />
    <ToolbarItem  Order="Primary" Priority="0" />
    <ToolbarItem  Order="Primary" Priority="0" />
    <ToolbarItem  Order="Primary" Priority="1" Icon="blue"/>
</ContentPage.ToolbarItems>

Effect

更新2:

您可以尝试使用博客中的BoxViewCustom App Header in Forms,它允许我们使用标题轻松更改所有内容页面的高度,图标,字体系列背景渐变。