自定义按钮无法正确应用静态资源

时间:2017-11-19 14:20:52

标签: xamarin.forms xamarin.android

我在app.xaml中定义了资源,如下所示

        <ResourceDictionary   x:Name="myResDic" >

            <!-- Styles -->
        <Color x:Key="grayDark">#959595</Color>
        <Style x:Key="buttonStyle" TargetType="Button">
            <Setter Property="TextColor" Value="#4fddb7" />
            <Setter Property="BorderRadius" Value="4" />
            <Setter Property="FontSize" Value="Small" />
            <Setter Property="BackgroundColor" Value="{StaticResource grayDark}" />
            <Setter Property="HeightRequest">
                <Setter.Value>
                    <OnPlatform x:TypeArguments="x:Double" iOS="40" Android="50" />
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="wizardButton" TargetType="Button" BasedOn="{StaticResource buttonStyle}">
            <Setter Property="BackgroundColor" Value="#3FFF" />
            <Setter Property="BorderColor" Value="#AFFF" />
            <Setter Property="TextColor" Value="#4fddb7" />
            <Setter Property="BorderWidth" Value=".5" />
        </Style>

如果我将它绑定到xamarin表单内容页面中的按钮,它可以正常工作

    <Button Text="Login with Facebook" Image="facebook.png"  
  VerticalOptions="EndAndExpand"  Style="{StaticResource wizardButton}"/>

但是我使用Android中的ButtonRenderers创建了一个自定义按钮,代码如下。但使用这种风格是不正常的。边界没有出现。请参见下面的截图。它继承了Button,为什么它不起作用?

      <controls:FacebookLoginButton Text="Login with Facebook" Image="facebook.png" VerticalOptions="EndAndExpand"  Style="{StaticResource wizardButton}"/>

   <Button Text="Skip"    Style="{StaticResource wizardButton}"/>


        public class FacebookLoginButton : Button
        {
            public FacebookLoginButton()
            {

            }
        }

显然,buttonrenderer导致了这个问题。当我排除它,它工作正常。这是我的android buttonrenderer类的样子

using System;
using Android.App;
using Android.Content; 
using Xamarin.Forms.Platform.Android;
using Object = Java.Lang.Object;
using View = Android.Views.View;
using Xamarin.Facebook;
using myApp.Helpers.Controls;
using myApp.Droid;
using Android.Widget;

[assembly: Xamarin.Forms.ExportRenderer(typeof(FacebookLoginButton), typeof(FacebookLoginButtonRendererAndroid))]
namespace myApp.Droid
{
    public class FacebookLoginButtonRendererAndroid : ButtonRenderer
    {
        private static Activity _activity;
        public FacebookLoginButtonRendererAndroid(Context context)
                  : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
        {
            base.OnElementChanged(e);

            _activity = this.Context as Activity;

            //DEBUG
            //Xamarin.Facebook.Login.LoginManager.Instance.LogOut();

            if (this.Control != null)
            {
                Button button = this.Control;
                button.SetOnClickListener(ButtonClickListener.Instance.Value);
            }

            if (AccessToken.CurrentAccessToken != null)
            {
                App.PostSuccessFacebookAction(AccessToken.CurrentAccessToken.Token);
            }
        }

        private class ButtonClickListener : Object, IOnClickListener
        {
            public static readonly Lazy<ButtonClickListener> Instance = new Lazy<ButtonClickListener>(() => new ButtonClickListener());

            public void OnClick(View v)
            {
                var myIntent = new Intent(_activity, typeof(FacebookActivity));
                _activity.StartActivityForResult(myIntent, 0);
            }
        }
    }
}

enter image description here

1 个答案:

答案 0 :(得分:1)

有两种方法可以做到这一点。

第一种是从样式中删除键,使其适用于所有类型为FacebookLoginButton的按钮。

这是一种隐式样式,details can be found here

<Style TargetType="FacebookLoginButton" BasedOn="{StaticResource buttonStyle}">
    <Setter Property="BackgroundColor" Value="#3FFF" />
    <Setter Property="BorderColor" Value="#AFFF" />
    <Setter Property="TextColor" Value="#4fddb7" />
    <Setter Property="BorderWidth" Value=".5" />
 </Style>

第二种方法是将一个可绑定样式属性添加到facebook按钮用户控件,将其绑定到XAML中的样式并在自定义渲染器中实现它。