以编程方式 returns 基于相对布局 c# 的布局约束的通用方法

Generic method that programatically returns a layout constraint based on Relative Layout c#

我有一个视图,在这个视图中我在代码后面添加组件而不是使用 xaml,我有一个相对布局和一个创建标签 Lbl 的 class和一个按钮 MyButton 作为参数传递 宽度、高度、img 源、标签文本和颜色

var innerLayout = new RelativeLayout() { BackgroundColor = Color.Black };
var myCustomhBtn = new Custom(100, 120, "img.png", "the text of label", Color.White);

现在我想将 xConstraintyConstraint 添加到每个组件。 所有这些都是 x 和 y 约束,形式为:

            innerLayout.Children.Add(  
            myCustomhBtn.MyButton,
            xConstraint: Constraint.RelativeToParent((parent) => {
                double x1 = parent.Width / 2 - myCustomhBtn.MyButton.Radius;
                double x2 = parent.Width - 2 * myCustomhBtn.MyButton.Radius;
                return (x1 + x2) / 2 + myCustomhBtn.MyButton.Radius/ 2;
            }),
            yConstraint: Constraint.RelativeToParent((parent) => {
                double y1 = 0;
                double y2 = parent.Height / 2 - 2 * myCustomhBtn.MyButton.Radius;
                return (y1 + y2) / 2 - myCustomhBtn.MyButton.Radius;
            }));
        innerLayout.Children.Add(
            myCustomhBtn.Lbl,
            Constraint.RelativeToView(myCustomhBtn.MyButton.Radius, (parent, sibling) => {
                return sibling.X + myCustomhBtn.MyButton.Radius- myCustomhBtn .Lbl.Width / 2;
            }), 
            Constraint.RelativeToView(myCustomhBtn.MyButton.Radius, (parent, sibling) => {
              return sibling.Y - 18;
             }));

对于标签,我只希望它是 y-18 向上按钮并居中 x

所以基本上我想做类似

的事情
var innerLayout = new RelativeLayout() { BackgroundColor = Color.Black };
    var myCustomhBtn = new Custom(100, 120, "img.png", "the text of label", Color.White);
AddComponent(innerlayout, x,y);

但由于每个约束的形式为 Func

xConstraint: Constraint.RelativeToParent((parent) => {return xxxx; })

我不知道如何创建泛型方法

怎么做?或者最好的方法是什么?

and I just want to create a function that recives x and y, and returns the respective x or y Constraint

您可以(虽然我不建议这样做)创建一个 returns Tuple of Constraint 的方法。

private (Constraint xConstraint, Constraint yConstraint) BuildConstraints(x, y)
{
    var xConstraint = Constraint.RelativeToParent(parent => /* whatever ... */);
    var yConstraint = Constraint.RelativeToParent(parent => /* whatever ... */);
    return (xConstraint, yConstraint);
}

但我宁愿为每个约束创建一个方法

Constraint BuildXConstraint(x)
{
    return Constraint.RelativeToParent(parent => /* whatever ... */);
}