我在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);
}
}
}
}
答案 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中的样式并在自定义渲染器中实现它。