Xamarin中的SetListener for View

时间:2014-08-08 17:08:50

标签: java c# android xamarin xamarin.android

我试图将一些Java代码移植到C#中。其中CW是一个扩展视图的类。 OnSelectedListener是一个以Cselected为接口的接口,它接受int参数。

setListener是类中的一个方法。问题在于实例化Java中的接口。

private View selectedView = new View( context );

        CW.setListener( new OnSelectedListener() {
    @Override
    public void cSelected(Integer color) {
    selectedColor = color;
    selectedView.setBackgroundColor( color );
    }
    });

同一方法中的另一个实现

VS.setListener( new OnSelectedListener() {
public void cSelected(Integer color) {
VS.setColor( color, true );
}
} );

有人可以帮我把上面的代码移植到C#吗?任何帮助表示赞赏。我正在使用Xamarin开发Android应用程序。

编辑:

这是完整的CW类

 public class HSVColorWheel : View
        {
            private const float SCALE = 2f;
            private const float FADE_OUT_FRACTION = 0.03f;
            private const int POINTER_LINE_WIDTH_DP = 2;
            private const int POINTER_LENGTH_DP = 10;

            private Context _context;

            public HSVColorWheel(Context context, IAttributeSet attrs, int defStyle)
                : base(context, attrs, defStyle)
            {
                this._context = context;
                Init();
            }

            public HSVColorWheel(Context context, IAttributeSet attrs) : base(context, attrs)
            {

                this._context = context;
                Init();
            }

            public HSVColorWheel(Context context) : base(context)
            {
                this._context = context;
                Init();
            }

            private int scale;
            private int pointerLength;
            private int innerPadding;
            private Paint pointerPaint = new Paint();

            private void Init()
            {
                float density = _context.Resources.DisplayMetrics.Density;
                scale = (int) (density*SCALE);
                pointerLength = (int) (density*POINTER_LENGTH_DP);
                pointerPaint.StrokeWidth = (int) (density*POINTER_LINE_WIDTH_DP);
                innerPadding = pointerLength/2;
            }

            public void setListener(OnSelectedListener listener)
            {
                _listener = listener;
            }

            private float[] colorHsv = {0f, 0f, 1f};

            public void setColor(Color color)
            {

                Color.ColorToHSV(color, colorHsv);
                Invalidate();
            }
}

接口:

public interface OnSelectedListener {

void cSelected( Integer color );
}

1 个答案:

答案 0 :(得分:2)

正如评论中所提到的,由于C#具有language-level support for events,因此它提供了比java"甚至是听众更清晰的方法。方法

因此,所有基于侦听器的java代码都应该在C#中转换为适当的事件。

在这种情况下,您似乎提出了一个int参数的事件。这在C#中声明如下:

//In the CW class:
public event EventHandler<int> SelectionChanged;

然后通过&#34;事件调用器&#34;引发,如下所示:

//In the CW class:
public void OnSelectionChanged()
{
    var handler = SelectionChanged;
    if (handler != null)
         handler(this, //[ some int value here ]);
}
来自&#34;消费者&#34;或&#34;听众&#34;你只需处理这个事件:

//In an Activity
var CW = new CW(this);

CW.SelectionChanged += CW_SelectionChanged;

其中CW_SelectionChanged可以是匿名方法,实际命名方法,甚至是lambda表达式:

CW.SelectionChanged += (sender, intValue) => //[here you do something with intValue]

// -- OR --

CW.SelectionChanged += this.CW_SelectionChanged;

// then
private void CW_SelectionChanged(object sender, int intValue)
{
   //[here you do something with intValue]
}

这样,您就不需要声明额外的,不需要的1方法接口。