2016-04-12 3 views
1

Итак, я получал эту ошибку в Xamarin, когда пытался создать настраиваемый переключатель с функцией textOn и textOff. Я просмотрел эту тему: https://forums.xamarin.com/discussion/26694/problem-creating-custom-renderer. И все еще не могу понять это. Это также мой первый раз, создавая пользовательский элемент управления для Xamarin, так что я, возможно, сделал некоторые ошибки начинающихXamarin - Custom Renderer Нет подходящего метода для переопределения

Вот мой код для моего пользовательского элемента управления:

[assembly:ExportRenderer(typeof(CustomSwitch), typeof(CustomSwitchRenderer))] 

namespace SalesKicker 
{ 
public class CustomSwitch : Android.Widget.Switch 
{ 
    public static readonly BindableProperty TextOnProperty = BindableProperty.Create<CustomSwitch, string>(p => p.TextOn, AppResources.CustomSwitch_DefaultTextOn); 
    public static readonly BindableProperty TextOffProperty = BindableProperty.Create<CustomSwitch, string>(p => p.TextOff, AppResources.CustomSwitch_DefaultTextOff); 

    public string TxtOn 
    { 
     get { return (string)GetValue(TextOnProperty); } 
     set { SetValue(TextOnProperty, value); } 
    } 

    public string TxtOff 
    { 
     get { return (string)GetValue(TextOffProperty); } 
     set { SetValue(TextOffProperty, value); } 
    } 
} 

public class CustomSwitchRenderer : SwitchRenderer 
{ 
//the error is being thrown here: Error CS0115: 'CustomSwitchRenderer.OnElementChanged(ElementChangedEventArgs<CustomSwitch>)': no suitable method found to override (CS0115) (SalesKicker.Droid) 
    protected override void OnElementChanged(ElementChangedEventArgs<SalesKicker.CustomSwitch> e) 
    { 
     base.OnElementChanged(e); 

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

     var customSwitch = this.Element; 

     var control = new Switch(Forms.Context) 
      { 
       TextOn = customSwitch.TxtOn, 
       TextOff = customSwitch.TxtOff 
      }; 

     this.SetNativeControl(control); 
    } 
} 
} 

Может кто-то пожалуйста, скажите мне, что I`m делаете неправильно здесь?

ответ

2

Тип параметра является частью function signature. Если вы переопределяете функции, они должны иметь одну и ту же подпись. Используйте ElementChangedEventArgs<Switch>.

protected override void OnElementChanged(ElementChangedEventArgs<Switch> e) 
+0

В его коде есть еще две проблемы: i) Он наследует Android.Widget.Switch в своем определении пользовательского контроля в проекте Forms. В то время как он должен был унаследовать Switch Control в Xamarin.Forms ii) Также он экспортирует рендер в проект Forms. В то время как это должно было быть в Android-проекте. Проверьте мой ответ – Sreeraj

+0

Да, вы правы :) Я сосредоточился только на ошибке компилятора. –

0

Try Изменение к этому

using System; 
using Xamarin.Forms; 
namespace SalesKicker 
{ 
public class CustomSwitch : Switch 
{ 
public static readonly BindableProperty TextOnProperty = BindableProperty.Create<CustomSwitch, string>(p => p.TextOn, AppResources.CustomSwitch_DefaultTextOn); 
public static readonly BindableProperty TextOffProperty = BindableProperty.Create<CustomSwitch, string>(p => p.TextOff, AppResources.CustomSwitch_DefaultTextOff); 

public string TxtOn 
{ 
    get { return (string)GetValue(TextOnProperty); } 
    set { SetValue(TextOnProperty, value); } 
} 

public string TxtOff 
{ 
    get { return (string)GetValue(TextOffProperty); } 
    set { SetValue(TextOffProperty, value); } 
} 
} 
} 

Этот класс в Xamarin.Forms проекта

Затем

[assembly:ExportRenderer(typeof(CustomSwitch), typeof(CustomSwitchRenderer))] 
namespace SalesKicker 
{ 
public class CustomSwitchRenderer : SwitchRenderer 
{ 
//the error is being thrown here: Error CS0115: 'CustomSwitchRenderer.OnElementChanged(ElementChangedEventArgs<CustomSwitch>)': no suitable method found to override (CS0115) (SalesKicker.Droid) 
protected override void OnElementChanged(ElementChangedEventArgs<Switch> e) 
{ 
    base.OnElementChanged(e); 

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

    var customSwitch = this.Element; 

    var control = new Switch(Forms.Context) 
     { 
      TextOn = customSwitch.TextOn, 
      TextOff = customSwitch.TextOff 
     }; 

    this.SetNativeControl(control); 
} 
} 
} 

Это в проекте Android. Скажите мне, если у вас есть какие-то дальнейшие проблемы. Это должно сработать для вас.

+0

Итак, что вы говорите, заключается в том, что рендеринг должен быть помещен внутри класса в SalesKicker.Droid? –

+0

Я думаю, он может позволить Xamarin Forms создать элемент управления и просто изменить его, установив 'Control.TextOn' и' Control.TextOff'. просто мой 2 ct :) –

+0

Итак, я должен поставить элемент управления в SalesKicker и рендеринг внутри SalesKicker.Droid? –

Смежные вопросы