Xamarin形式效应

时间:2016-11-08 11:37:59

标签: c# xamarin xamarin.forms

我创建了一个效果来自定义xamarin表单中的switch元素,但我在第15行发现了错误(指定的强制转换无效)。有什么想改变这个吗?我的班级吼叫

using Android.Graphics;
using Android.Widget;
using Puuber.Droid.Platform;
using Xamarin.Forms.Platform.Android;


[assembly: Xamarin.Forms.ExportEffect(typeof(PinkSwitchEffect), "PinkSwitchEffect")]
namespace Puuber.Droid.Platform
{
class PinkSwitchEffect: PlatformEffect
{
    protected override void OnAttached()
    {
        var toggle = (Android.Widget.Switch)Control;
        Xamarin.Forms.Color gold = Xamarin.Forms.Color.FromHex("#fcb741");

        toggle.TrackDrawable.SetColorFilter(new PorterDuffColorFilter(gold.ToAndroid(), PorterDuff.Mode.SrcIn));      
    }

    protected override void OnDetached()
    {
        // Use this method if you wish to reset the control to original state
    }
}

我的xaml文件就是这样,效果在xaml文件中添加:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:local="clr-namespace:Puuber;assembly=Puuber"
    x:Class="Puuber.Welcome">
<AbsoluteLayout BackgroundColor="#161616">
<Image Source="logo.png" AbsoluteLayout.LayoutBounds="0.5 ,0, 1, 0.4" AbsoluteLayout.LayoutFlags="XProportional,YProportional,WidthProportional, HeightProportional"/>
  <Label x:Name="rangeText" TextColor="#ffffff" FontSize = "24" Text="5 Km" HorizontalTextAlignment="End" AbsoluteLayout.LayoutBounds="0.8 ,0.5, 0.25, 0.1" AbsoluteLayout.LayoutFlags="XProportional,YProportional,WidthProportional, HeightProportional" local:CustomFontEffect.FontFileName="OpenSans-Regular">
      <Label.FontFamily>
          <OnPlatform x:TypeArguments="x:String">
              <OnPlatform.Android></OnPlatform.Android>   
            </OnPlatform>
      </Label.FontFamily>  
  </Label>
  <Slider x:Name="rangeSlider" Maximum="100" Minimum="5" ValueChanged="rangeSlider_ValueChanged" AbsoluteLayout.LayoutBounds="0.5 ,0.55, 0.8, 0.1" AbsoluteLayout.LayoutFlags="XProportional,YProportional,WidthProportional, HeightProportional">
      <Slider.Effects>
          <local:GoldSliderEffect/>
      </Slider.Effects>
  </Slider>
  <Label Text="Mulheres" TextColor="#ffffff" FontSize = "24" HorizontalTextAlignment="Center" AbsoluteLayout.LayoutBounds="0.5 ,0.7, 0.5, 0.1" AbsoluteLayout.LayoutFlags="XProportional,YProportional,WidthProportional, HeightProportional" local:CustomFontEffect.FontFileName="OpenSans-Regular">
      <Label.FontFamily>
          <OnPlatform x:TypeArguments="x:String">
              <OnPlatform.Android></OnPlatform.Android>   
            </OnPlatform>
      </Label.FontFamily>  
  </Label>
<Switch IsToggled="{Binding isOn}" AbsoluteLayout.LayoutBounds="0.8 ,0.667, 0.15, 0.05" AbsoluteLayout.LayoutFlags="XProportional, YProportional, WidthProportional, HeightProportional">
  <Switch.Effects>
          <local:PinkSwitchEffect/>
      </Switch.Effects>
</Switch>
  <Label Text="Homens" TextColor="#ffffff" FontSize = "24" HorizontalTextAlignment="Center" AbsoluteLayout.LayoutBounds="0.5 ,0.80, 0.5, 0.1" AbsoluteLayout.LayoutFlags="XProportional,YProportional,WidthProportional, HeightProportional" local:CustomFontEffect.FontFileName="OpenSans-Regular">
      <Label.FontFamily>
          <OnPlatform x:TypeArguments="x:String">
              <OnPlatform.Android></OnPlatform.Android>   
            </OnPlatform>
      </Label.FontFamily>  
  </Label>
<Switch IsToggled="{Binding isOn}" AbsoluteLayout.LayoutBounds="0.8 ,0.767, 0.15, 0.05" AbsoluteLayout.LayoutFlags="XProportional, YProportional, WidthProportional, HeightProportional"/>
<Label Text="Travestis" TextColor="#ffffff" FontSize = "24" HorizontalTextAlignment="Center" AbsoluteLayout.LayoutBounds="0.5 ,0.9, 0.5, 0.1" AbsoluteLayout.LayoutFlags="XProportional,YProportional,WidthProportional, HeightProportional" local:CustomFontEffect.FontFileName="OpenSans-Regular">
      <Label.FontFamily>
          <OnPlatform x:TypeArguments="x:String">
              <OnPlatform.Android></OnPlatform.Android>   
            </OnPlatform>
      </Label.FontFamily>  
  </Label>
  <Switch IsToggled="{Binding isOn}" AbsoluteLayout.LayoutBounds="0.8 ,0.867, 0.15, 0.05" AbsoluteLayout.LayoutFlags="XProportional, YProportional, WidthProportional, HeightProportional"/>
</AbsoluteLayout>
</ContentPage>

1 个答案:

答案 0 :(得分:0)

您的Control可能是Android.Support.V7.Widget.SwitchCompat而不是Android.Widget.Switch的实例。默认情况下,当您启动新的Xamarin Forms项目时,Android MainActivity会继承global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity。在这种情况下,XAML Switch将成为SwitchCompat而不是Android.Widget.Switch

通过查看Visual Studio或Xamarin Studio中的检查器,您可以了解Control的类型。因此,如果var toggle = (Android.Support.V7.Widget.SwitchCompat)Control;具有Control类型,请将第15行更改为SwitchCompat

由于您遇到了错误,我希望您已经完成了以下操作,但只是为了完成:

请注意,Android项目中需要ResolutionGroupName装配属性,PCL /共享项目中需要RoutingEffect才能正确引用效果。有关此示例,请参阅https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/effects/creating/

作为参考,这是Android渲染器基于MainActivity基类创建的本机控件: