C# 如何使这个xamarin开关渲染器代码正常工作?

C# 如何使这个xamarin开关渲染器代码正常工作?,c#,xamarin,xamarin.forms,renderer,custom-renderer,C#,Xamarin,Xamarin.forms,Renderer,Custom Renderer,我正在尝试使此开关渲染器正常工作,但visual studio无法识别CustomSwitch,编译失败,并显示消息“未找到类型“local:CustomSwitch”。请验证您是否缺少程序集引用,以及是否已生成所有引用的程序集。(MasterDetailPageNavigation) 我的项目文件夹中有CustomSwitch.cs: using Xamarin.Forms; public class CustomSwitch : Switch { public static rea

我正在尝试使此开关渲染器正常工作,但visual studio无法识别CustomSwitch,编译失败,并显示消息“未找到类型“local:CustomSwitch”。请验证您是否缺少程序集引用,以及是否已生成所有引用的程序集。(MasterDetailPageNavigation)

我的项目文件夹中有CustomSwitch.cs

using Xamarin.Forms;

public class CustomSwitch : Switch
{
    public static readonly BindableProperty SwitchOffColorProperty =
      BindableProperty.Create(nameof(SwitchOffColor),
          typeof(Color), typeof(CustomSwitch),
          Color.Default);

    public Color SwitchOffColor
    {
        get { return (Color)GetValue(SwitchOffColorProperty); }
        set { SetValue(SwitchOffColorProperty, value); }
    }

    public static readonly BindableProperty SwitchOnColorProperty =
      BindableProperty.Create(nameof(SwitchOnColor),
          typeof(Color), typeof(CustomSwitch),
          Color.Default);

    public Color SwitchOnColor
    {
        get { return (Color)GetValue(SwitchOnColorProperty); }
        set { SetValue(SwitchOnColorProperty, value); }
    }

    public static readonly BindableProperty SwitchThumbColorProperty =
      BindableProperty.Create(nameof(SwitchThumbColor),
          typeof(Color), typeof(CustomSwitch),
          Color.Default);

    public Color SwitchThumbColor
    {
        get { return (Color)GetValue(SwitchThumbColorProperty); }
        set { SetValue(SwitchThumbColorProperty, value); }
    }

    public static readonly BindableProperty SwitchThumbImageProperty =
      BindableProperty.Create(nameof(SwitchThumbImage),
          typeof(string),
          typeof(CustomSwitch),
          string.Empty);

    public string SwitchThumbImage
    {
        get { return (string)GetValue(SwitchThumbImageProperty); }
        set { SetValue(SwitchThumbImageProperty, value); }
    }
}
在project.droid文件夹中,我有CustomSwitchRenderer.cs

using System;
using Android.Graphics;
using Android.Widget;
using MasterDetailPageNavigation.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(CustomSwitch), typeof(CustomSwitchRenderer))]
namespace MasterDetailPageNavigation.Droid
{
    [Obsolete]
    public class CustomSwitchRenderer : SwitchRenderer
    {
        private CustomSwitch view;
        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Switch> e)
        {
            base.OnElementChanged(e);
            if (e.OldElement != null || e.NewElement == null)
                return;
            view = (CustomSwitch)Element;
            if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.JellyBean)
            {
                if (this.Control != null)
                {
                    if (this.Control.Checked)
                    {
                        this.Control.TrackDrawable.SetColorFilter(view.SwitchOnColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
                    }
                    else
                    {
                        this.Control.TrackDrawable.SetColorFilter(view.SwitchOffColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
                    }
                    this.Control.CheckedChange += this.OnCheckedChange;
                    UpdateSwitchThumbImage(view);
                }
                //Control.TrackDrawable.SetColorFilter(view.SwitchBGColor.ToAndroid(), PorterDuff.Mode.Multiply);  
            }
        }

        private void UpdateSwitchThumbImage(CustomSwitch view)
        {
            if (!string.IsNullOrEmpty(view.SwitchThumbImage))
            {
                view.SwitchThumbImage = view.SwitchThumbImage.Replace(".jpg", "").Replace(".png", "");
                int imgid = (int)typeof(Resource.Drawable).GetField(view.SwitchThumbImage).GetValue(null);
                Control.SetThumbResource(Resource.Drawable.icon);
            }
            else
            {
                Control.ThumbDrawable.SetColorFilter(view.SwitchThumbColor.ToAndroid(), PorterDuff.Mode.Multiply);
                // Control.SetTrackResource(Resource.Drawable.track);  
            }
        }

        private void OnCheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e)
        {
            if (this.Control.Checked)
            {
                this.Control.TrackDrawable.SetColorFilter(view.SwitchOnColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
            }
            else
            {
                this.Control.TrackDrawable.SetColorFilter(view.SwitchOffColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
            }
        }
        protected override void Dispose(bool disposing)
        {
            this.Control.CheckedChange -= this.OnCheckedChange;
            base.Dispose(disposing);
        }
    }
}
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:behavior="clr-namespace:MasterDetailPageNavigation.XAML"
             xmlns:local="clr-namespace:MasterDetailPageNavigation"
             x:Class="MasterDetailPageNavigation.XAML.CompletaCadastroProf"
             BackgroundImageSource="background">
    <ContentPage.Content>
       <StackLayout>

        <local:CustomSwitch SwitchOnColor="Red" Grid.Column="0" Grid.Row="0" />

 ...
 ...

使用系统;
使用Android.Graphics;
使用Android.Widget;
使用MasterDetailPageNavigation.Droid;
使用Xamarin.Forms;
使用Xamarin.Forms.Platform.Android;
[程序集:ExportRenderer(typeof(CustomSwitch)、typeof(CustomSwitchRenderer))]
命名空间MasterDetailPageNavigation.Droid
{
[过时]
公共类CustomSwitchRenderer:SwitchRenderer
{
私有交换机视图;
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(e.OldElement!=null | | e.NewElement==null)
返回;
视图=(CustomSwitch)元素;
if(Android.OS.Build.VERSION.SdkInt>=Android.OS.BuildVersionCodes.JellyBean)
{
if(this.Control!=null)
{
if(this.Control.Checked)
{
this.Control.TrackDrawable.SetColorFilter(view.SwitchOnColor.ToAndroid(),PorterDuff.Mode.SrcAtop);
}
其他的
{
this.Control.TrackDrawable.SetColorFilter(view.SwitchOffColor.ToAndroid(),PorterDuff.Mode.SrcAtop);
}
this.Control.CheckedChange+=this.OnCheckedChange;
更新SwitchThumbImage(视图);
}
//Control.TrackDrawable.SetColorFilter(view.SwitchBGColor.ToAndroid(),PorterDuff.Mode.Multiply);
}
}
私有void更新SwitchThumbImage(CustomSwitch视图)
{
如果(!string.IsNullOrEmpty(view.SwitchThumbImage))
{
view.SwitchThumbImage=view.SwitchThumbImage.Replace(“.jpg”和“”).Replace(“.png”和“”);
intimgid=(int)typeof(Resource.Drawable).GetField(view.SwitchThumbImage).GetValue(null);
Control.SetThumbResource(Resource.Drawable.icon);
}
其他的
{
Control.ThumbDrawable.SetColorFilter(view.SwitchThumbColor.ToAndroid(),PorterDuff.Mode.Multiply);
//Control.SetTrackResource(Resource.Drawable.track);
}
}
私有void OnCheckedChange(对象发送方,CompoundButton.CheckedChangeEventArgs e)
{
if(this.Control.Checked)
{
this.Control.TrackDrawable.SetColorFilter(view.SwitchOnColor.ToAndroid(),PorterDuff.Mode.SrcAtop);
}
其他的
{
this.Control.TrackDrawable.SetColorFilter(view.SwitchOffColor.ToAndroid(),PorterDuff.Mode.SrcAtop);
}
}
受保护的覆盖无效处置(布尔处置)
{
this.Control.CheckedChange-=this.OnCheckedChange;
基地。处置(处置);
}
}
}
这是我的xaml的相关部分:

using System;
using Android.Graphics;
using Android.Widget;
using MasterDetailPageNavigation.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(CustomSwitch), typeof(CustomSwitchRenderer))]
namespace MasterDetailPageNavigation.Droid
{
    [Obsolete]
    public class CustomSwitchRenderer : SwitchRenderer
    {
        private CustomSwitch view;
        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Switch> e)
        {
            base.OnElementChanged(e);
            if (e.OldElement != null || e.NewElement == null)
                return;
            view = (CustomSwitch)Element;
            if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.JellyBean)
            {
                if (this.Control != null)
                {
                    if (this.Control.Checked)
                    {
                        this.Control.TrackDrawable.SetColorFilter(view.SwitchOnColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
                    }
                    else
                    {
                        this.Control.TrackDrawable.SetColorFilter(view.SwitchOffColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
                    }
                    this.Control.CheckedChange += this.OnCheckedChange;
                    UpdateSwitchThumbImage(view);
                }
                //Control.TrackDrawable.SetColorFilter(view.SwitchBGColor.ToAndroid(), PorterDuff.Mode.Multiply);  
            }
        }

        private void UpdateSwitchThumbImage(CustomSwitch view)
        {
            if (!string.IsNullOrEmpty(view.SwitchThumbImage))
            {
                view.SwitchThumbImage = view.SwitchThumbImage.Replace(".jpg", "").Replace(".png", "");
                int imgid = (int)typeof(Resource.Drawable).GetField(view.SwitchThumbImage).GetValue(null);
                Control.SetThumbResource(Resource.Drawable.icon);
            }
            else
            {
                Control.ThumbDrawable.SetColorFilter(view.SwitchThumbColor.ToAndroid(), PorterDuff.Mode.Multiply);
                // Control.SetTrackResource(Resource.Drawable.track);  
            }
        }

        private void OnCheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e)
        {
            if (this.Control.Checked)
            {
                this.Control.TrackDrawable.SetColorFilter(view.SwitchOnColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
            }
            else
            {
                this.Control.TrackDrawable.SetColorFilter(view.SwitchOffColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
            }
        }
        protected override void Dispose(bool disposing)
        {
            this.Control.CheckedChange -= this.OnCheckedChange;
            base.Dispose(disposing);
        }
    }
}
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:behavior="clr-namespace:MasterDetailPageNavigation.XAML"
             xmlns:local="clr-namespace:MasterDetailPageNavigation"
             x:Class="MasterDetailPageNavigation.XAML.CompletaCadastroProf"
             BackgroundImageSource="background">
    <ContentPage.Content>
       <StackLayout>

        <local:CustomSwitch SwitchOnColor="Red" Grid.Column="0" Grid.Row="0" />

 ...
 ...


...
...

可能是我忘了添加一些参考资料,你们看到我做错了什么了吗?

首先,如果您不将您的
CustomSwitch
像下面的屏幕截图一样放在这个项目的根路径中,

请更改我更改的另一个前缀
myswitch
我的代码,格式如下

  <myswitch:CustomSwitch SwitchOffColor="Green"  SwitchOnColor="Red"  />

如果您完成了上述设置,此问题仍然存在,请关闭VS,打开项目文件夹,删除所有
bin
obj
文件夹(xxx,xxx.Android,xxx.iOS文件夹),最后重建项目。

我没有给CustomSwitch.cs提供名称空间,只是添加了

namespace MasterDetailPageNavigation.XAML
{ 
...
}

现在一切正常。

CustomSwitch
似乎没有使用任何名称空间,因此它与您声明的名称空间不匹配
xmlns:local
@Sandro Benevides如果您已解决此问题,请发布您的解决方案以回答,它将帮助其他有类似问题的人。当然,对不起,我迟了回答。谢谢你的回答,请标记你的答案,这将帮助其他有类似问题的人。