gpt4 book ai didi

java - Xamarin 中 View 的 SetListener

转载 作者:行者123 更新时间:2023-12-02 05:34:02 24 4
gpt4 key购买 nike

我正在尝试将一些 Java 代码移植到 C# 中。其中 CW 是扩展 View 的类。 OnSelectedListener 是一个以 Cselected 作为方法的接口(interface),该方法采用 int 参数。

setListener 是类中的一个方法。问题在于像 Java 中那样实例化接口(interface)。

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 类(class)

 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 );
}

最佳答案

正如评论中提到的,因为 C# 有 language-level support for events ,它提供了一种比 java 的“偶数监听器”方法更简洁的方法。

因此,所有基于监听器的 Java 代码都应转换为 C# 中的正确事件。

在本例中,您似乎正在引发一个具有 int 的事件。范围。在 C# 中声明如下:

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

然后通过“事件调用器”引发,如下所示:

//In the CW class:
public void OnSelectionChanged()
{
var handler = SelectionChanged;
if (handler != null)
handler(this, //[ some int value here ]);
}

从“消费者”或“监听器”端,您只需处理事件:

//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-method 接口(interface)。

关于java - Xamarin 中 View 的 SetListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25208659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com