【问题标题】:How to Add a Gradient in Xamarin forms Toolbar and UINavigationBar如何在 Xamarin 表单工具栏和 UINavigationBar 中添加渐变
【发布时间】:2017-10-18 12:02:14
【问题描述】:

我正在为 Android 和 iOS 操作系统创建一个 xamarin 表单跨平台应用程序。我必须在两个操作系统(在 android 中称为 ToolBar 和在 ios 中称为 UINavigationBar)中的 AppBars 中添加渐变,有什么方法可以做到这一点。请帮我应付......任何事情。

【问题讨论】:

  • 最后的手段是使用图片,但我强烈不推荐。
  • @LeRoy 你知道如何将图像应用到 Appbar

标签: android xamarin xamarin.forms


【解决方案1】:

您应该使用自定义渲染,如下所示:

在您的 PCL 或共享项目中:

public class NavigationPageGradientHeader : NavigationPage
{
    public NavigationPageGradientHeader(Page root) : base(root)
    {
    }
    
    public static readonly BindableProperty RightColorProperty =
      BindableProperty.Create(propertyName: nameof(RightColor),
          returnType: typeof(Color),
          declaringType: typeof(NavigationPageGradientHeader),
          defaultValue: Color.Accent);

    public static readonly BindableProperty LeftColorProperty =
       BindableProperty.Create(propertyName: nameof(LeftColor),
           returnType: typeof(Color),
           declaringType: typeof(NavigationPageGradientHeader),
           defaultValue: Color.Accent);

    public Color RightColor
    {
        get { return (Color)GetValue(RightColorProperty); }
        set { SetValue(RightColorProperty, value); }
    }

    public Color LeftColor
    {
        get { return (Color)GetValue(LeftColorProperty); }
        set { SetValue(LeftColorProperty, value); }
    }
}

[更新]

我花时间创建了一个例子,你可以在Github看到它。

然后在你的 Android 项目中:

[assembly: ExportRenderer(typeof(NavigationPageGradientHeader), typeof(NavigationPageGradientHeaderRenderer))]
namespace YournameSpace.Droid
{
    public class NavigationPageGradientHeaderRenderer : NavigationRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e)
        {
            base.OnElementChanged(e);

            //run once when element is created
            if (e.OldElement != null || Element == null)
            {
            return;
            }

            var control = (NavigationPageGradientHeader)this.Element;
            var context = (MainActivity)this.Context;

            context.ActionBar.SetBackgroundDrawable(new GradientDrawable(GradientDrawable.Orientation.RightLeft, new int[] { control.RightColor.ToAndroid(), control.LeftColor.ToAndroid() }));
        }
    }
}

如果你在MainActivity 中使用FormsAppCompatActivity,只需在gradient 中添加一个drawable,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >

  <gradient
      android:angle="180"
      android:centerColor="#26C986"
      android:endColor="#109F8D"
      android:startColor="#36ED81"
      android:type="linear" />

</shape>

然后在你的Toolbar.axml 文件中调用这个drawable:

<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="@drawable/gradient"
   android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
   android:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

在你的 iOS 项目中:

[assembly: ExportRenderer(typeof(NavigationPageGradientHeader), typeof(NavigationPageGradientHeaderRenderer))]
namespace YourNameSpace.iOS
{
    public class NavigationPageGradientHeaderRenderer: NavigationRenderer
    {
        public override void ViewWillAppear(bool animated)
        {
            base.ViewWillAppear(animated);

            var control = (NavigationPageGradientHeader)this.Element;

            var gradientLayer = new CAGradientLayer();
            gradientLayer.Bounds = NavigationBar.Bounds;
            gradientLayer.Colors = new CGColor[] { control.RightColor.ToCGColor(), control.LeftColor.ToCGColor() };
            gradientLayer.StartPoint = new CGPoint(0.0, 0.5);
            gradientLayer.EndPoint = new CGPoint(1.0, 0.5);

            UIGraphics.BeginImageContext(gradientLayer.Bounds.Size);
            gradientLayer.RenderInContext(UIGraphics.GetCurrentContext());
            UIImage image = UIGraphics.GetImageFromCurrentImageContext();
            UIGraphics.EndImageContext();

            NavigationBar.SetBackgroundImage(image, UIBarMetrics.Default);
        }
    }
}

最后在你的App.xaml.cs 文件中这样调用这个控件:

MainPage = new NavigationPageGradientHeader(new MainPage()) {
     LeftColor = Color.FromHex("#109F8D"),
     RightColor = Color.FromHex("#36ED81")
};

【讨论】:

  • 嗨@Wilson,我会试试你的解决方案。请告诉我如何找到程序集名称。
  • 嗨@Wilson,我已经尝试过您的解决方案。但我在 &lt;controls:NavigationPageGradientHeader 行中遇到了一个名为 The given key was not present in the dictionary. 的错误。你有什么想法吗?
  • 如果你可以创建一个 github 项目并分享这个.. 它也会提供更多的价值和清晰
  • 失望?我在睡觉,我不能 24 小时为你服务。所以我创建了一个例子来解决你的问题。请看我的更新
  • 是的,但你应该为此提出一个新问题:)
猜你喜欢
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多