Xamarin.Forms - 可以使用原始元素名称编写自定义渲染器?

问题描述:

在Xamarin.Forms中,通常我会使用类名称(如“ButtonExt”)为按钮编写自定义渲染器。是否有可能使用原始名称(我猜覆盖)元素来编写自定义渲染器,如“Button”?Xamarin.Forms - 可以使用原始元素名称编写自定义渲染器?

基本上,我希望能够为我的应用程序中的所有按钮添加水平填充,但无需重命名所有Button s到ButtonExt(Xamarin.Forms中没有用于按钮的Padding属性)。换句话说,我希望能够说new Button { Padding = 20 }而不是说new ButtonExt { Padding = 20 }(项目是C#,而不是XAML)。

通常,在iOS的项目,我有:

[assembly: ExportRenderer(typeof(ButtonExt), typeof(ButtonExtRenderer))] 
namespace StoreFulfillment.iOS 
{ 
    public class ButtonExtRenderer : ButtonRenderer 

,并在共享项目中,我有:

using MySharedProject; 
using Xamarin.Forms; 

namespace MySharedProject.Renderers 
{ 
    public class ButtonExt : Button 
    { 
     ... 

然后我会说new ButtonExt { Padding = 20 }。但为了能够写new Button { Padding = 20 },我不能写public class Button : Button ......所以我该如何做到这一点?

+0

@ hvaughan3 - 只是扩大我的问题 - 你能解决更新问题吗? – jbyrd

+0

想知道如果扩展方法是答案 - https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods – jbyrd

当然!只需将其注册为正常的Button类型,并确保您调用所覆盖的所有基本方法,以保持原始的工作方式。

所以,你的属性,来注册的渲染器只是看起来像这样:

[assembly: ExportRenderer(typeof(Button), typeof(YourButtonRenderer))] 

此外,还要确保你的实际需要自定义呈现。如果你只是想要一个简单的样式问题,请看Xamarin.Forms​​,尤其是隐式样式。

+0

感谢您的快速响应 - 将尝试。是的,我知道所有关于样式,以及按钮如何做*不*具有填充属性:) – jbyrd

+0

但是在Xamarin共享项目中,我将如何创建要为其添加自定义属性的类(即Padding)?使用ButtonExt,我声明类像'公共类ButtonExt:按钮{...' - 我不能做'公共类按钮:按钮'...? – jbyrd

+1

@jbyrd您不能将自定义属性添加到已创建的类中,除非该类是“partial”类,而“Button”不是。因此,如您所说,您可以选择创建扩展方法或创建[附加属性](https://developer.xamarin.com/guides/xamarin-forms/xaml/attached-properties/),这就是'Grid.Row'属性(意思是'Button'类实际上没有'Button.Grid.Row'属性,但它仍然可以使用它)。我不认为我会使用附加的属性来处理你想要做的事情,但它仍然是一种选择。 – hvaughan3