C# 覆盖Xamarin中的ViewRenderer

C# 覆盖Xamarin中的ViewRenderer,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,作为学习Xamarin的另一步,我正在做一个关于如何在Xamarin多平台项目(完整的github代码)上绘制形状的测试项目 该项目试图复制另一个github项目(link),但使用了一个新的空白Xamarin表单项目。然后,我尝试将原始代码的各个部分放在一起,并尝试理解它们 专注于Android,在将代码放在一起之后,图形没有正确绘制。我正在努力解决这个问题,我认为这一切都归结为: 原始项目中已达到OnElementChanged中的断点(请参阅源文件)。但是在我的新项目中,OnElement

作为学习Xamarin的另一步,我正在做一个关于如何在Xamarin多平台项目(完整的github代码)上绘制形状的测试项目

该项目试图复制另一个github项目(link),但使用了一个新的空白Xamarin表单项目。然后,我尝试将原始代码的各个部分放在一起,并尝试理解它们

专注于Android,在将代码放在一起之后,图形没有正确绘制。我正在努力解决这个问题,我认为这一切都归结为:

原始项目中已达到
OnElementChanged
中的断点(请参阅源文件)。但是在我的新项目中,
OnElementChanged
中的断点未到达(请参阅源文件)

SharpRenderer
在.Droid和.iOS项目中都存在,但我不理解代码是如何相互关联的。我似乎没有发现这两种代码之间有什么有意义的区别,这两种代码都不能帮助我理解正在发生的事情


SharpRenderer
在一种情况下达到但在另一种情况下未达到的代码:

public class ShapeRenderer : ViewRenderer<ShapeView, Shape>
{
    public ShapeRenderer()
    {
    }

    protected override void OnElementChanged(ElementChangedEventArgs<ShapeView> e)
    {
        base.OnElementChanged(e);

        if (e.OldElement != null || this.Element == null)
            return;

        SetNativeControl(new Shape(Resources.DisplayMetrics.Density, Context)
        {
            ShapeView = Element
        });
    }
}
公共类ShaperEnder:ViewRenderer
{
公共shaperender()
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(e.OldElement!=null | | this.Element==null)
返回;
SetNativeControl(新形状(Resources.DisplayMetrics.Density,Context)
{
ShapeView=元素
});
}
}

您的代码缺少渲染器类上方的重要一行:

[assembly:ExportRenderer (typeof(ShapeView), typeof(ShapeRenderer))]
这意味着您的类将被导出,然后使用Xamarin Forms Framework呈现
ShapeView


为了更好地理解,您可以查看文档。

“在此处查看源文件”在某种程度上肯定是一个断开的链接。请直接在问题中添加任何必需的相关信息。我已经添加了.Droid项目中的
shaperender
代码。请让我知道在主帖子中是否需要任何其他代码(因为错误发生在项目之间的交互中,所以我很难确定哪些部分是必需的,哪些部分不是)。您缺少这行代码:
[assembly:ExportRenderer(typeof(ShapeView),typeof(shaperender))]
。它位于名称空间之上,非常重要
ExportRenderer
alerts Xamarin.Forms使用您的类来呈现指定的视图类,否则Xamarin.Forms将尝试使用默认呈现程序。@DylanS就是这样,非常感谢。也谢谢你的解释。看到.Droid和.iOS中的
SharpRenderer
,我已经得到一个提示,
SharpRenderer
被覆盖了,但我不知道Xamarin是怎么做到的。现在它就像一个符咒。