C# 如何使这个xamarin开关渲染器代码正常工作?
我正在尝试使此开关渲染器正常工作,但visual studio无法识别CustomSwitch,编译失败,并显示消息“未找到类型“local:CustomSwitch”。请验证您是否缺少程序集引用,以及是否已生成所有引用的程序集。(MasterDetailPageNavigation) 我的项目文件夹中有CustomSwitch.cs: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
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如果您已解决此问题,请发布您的解决方案以回答,它将帮助其他有类似问题的人。当然,对不起,我迟了回答。谢谢你的回答,请标记你的答案,这将帮助其他有类似问题的人。