【问题标题】:How to implement custom renderers for Xamarin controls如何为 Xamarin 控件实现自定义渲染器
【发布时间】:2020-11-23 17:30:56
【问题描述】:

有人可以帮忙解决以下问题吗?

我在 Visual Studio 中有一个 Xamarin Android 项目。我有一个 Picker 控件,我想为它制作一个自定义渲染器以使文本居中。

我在解决方案 OGLMobile 和 OGLMobile.Android 中有两个项目。

在 MainActivity.cs 的 OGLMobile.Android 项目中,我有以下代码(所有编译都很好):

[assembly: ExportRenderer(typeof(OGLMobile.Droid.MyPicker), typeof(OGLMobile.Droid.BetterPickerRenderer))]

.
.
.

public class MyPicker : Picker
    {
        public MyPicker() : base()
        {
        }
    }

    public class BetterPickerRenderer : PickerRenderer
    {
        public BetterPickerRenderer(Context context) : base(context)
        {
        }

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

            if (Control != null)
            {
                Control.Gravity = Android.Views.GravityFlags.CenterHorizontal;
            }
        }
    }

我的问题是,如何在 OGLMobile 项目中使用它,我想在 MainPage.xaml.cs 中的 C# 中动态创建这样的控件?

所以我现在有:

private Picker m_picker = null;

我想要:

private MyPicker m_picker = null;

目前在此解决方案中找不到类型 MyPicker。

感谢您的帮助, 米奇。

【问题讨论】:

  • MyPicker 需要在共享表单项目中定义,并且渲染器需要在平台项目中

标签: c# xamarin


【解决方案1】:

就像 Jason 所说,将 MyPicker 放在 Xamarin.forms 中,并将渲染器放在 Droid 平台项目中,如下所示。

android平台项目中的渲染器类:

[assembly: ExportRenderer(typeof(MyPicker), typeof(BetterPickerRenderer))]
namespace Test.Droid
{
class BetterPickerRenderer : PickerRenderer
{
    public BetterPickerRenderer(Context context) : base(context)
    {
    }

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

        if (Control != null)
        {
            Control.Gravity = Android.Views.GravityFlags.CenterHorizontal;
        }
    }
}
}

用法:

【讨论】:

  • 非常感谢你们。感谢您的澄清,我现在可以正常工作了。
  • 如果你解决了这个问题,你可以接受作为答案。这将帮助有同样问题的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多