Xamarin.ios Monotouch对话框:设置元素样式

Xamarin.ios Monotouch对话框:设置元素样式,xamarin.ios,monotouch.dialog,Xamarin.ios,Monotouch.dialog,我正在使用Dialog并希望设置所有单元格的样式。我有一个背景图像,在示例中我可以看到如何使用StyledStringElement来使用该图像 但是,在实际使用中,某些部分使用其他元素。例如,一个部分中的最后一个元素是RootElement,但它没有要设置的BackgroundUri属性。布尔元素也是如此 我发现了这个问题——一年半前也是一个类似的问题。上述UIAppearance样式确实适用于tablecells,但不适用于MTDialog。krtrego对这个问题的回答声称要做这项工作,但

我正在使用Dialog并希望设置所有单元格的样式。我有一个背景图像,在示例中我可以看到如何使用StyledStringElement来使用该图像

但是,在实际使用中,某些部分使用其他元素。例如,一个部分中的最后一个元素是RootElement,但它没有要设置的BackgroundUri属性。布尔元素也是如此

我发现了这个问题——一年半前也是一个类似的问题。上述UIAppearance样式确实适用于tablecells,但不适用于MTDialog。krtrego对这个问题的回答声称要做这项工作,但在我实现它的时候没有进行任何样式化

现在有没有改进的方法?实现这些其他控件类型的我自己的“样式化”版本将是一项巨大的工作,看看styledstringelement,这超出了我目前的技能水平

下面是一个我想要实现的示例(“tags”单元格下面的阴影,但该元素实际上是一个根元素,下面有一组无线电选项)。删除默认的灰线等是很容易的,但把一个微妙的阴影对每个部分的底部单元格是我无法解决的

非常感谢

注:在删除单元格背景和边框的正常MTDialog屏幕上,每个部分下方都有一个微妙的白色阴影/线条。如果我能回忆起我要去的地方还有很长的路要走


子类化元素将允许您通过重写GetCell方法来设置它的样式,但这会变得非常乏味。我遇到的最好的解决方案是创建一个自定义的DialogViewController,方法是将其子类化,并使用您自己的SizingSource和GetCell()方法覆盖CreateSizengSource方法,这些方法使用您想要用于单元格的每个场景的图像(顶部、中部、底部)。这是一段代码,我的示例不会处理不均匀的行,但这是我见过的唯一不修改MT.D源代码的解决方案

以下是您将在DialogViewController子类中覆盖的内容:

public override Source CreateSizingSource(bool unevenRows)
{
     return new CustomSource(unevenRows);
}
然后您将创建一个自定义源类:

public class CustomSource : Source
{
    public CustomSource(DialogViewController parent) : base (parent)
    {

    }

    public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
    {
        var theCell = base.GetCell(tableView, indexPath);

        if (RowsInSection(tableView, indexPath.Section) == 1) //use one with top and bottom rounded
        {
            theCell.BackgroundView = new UIImageView(Theme.CellBackgroundFull);
            theCell.SelectedBackgroundView = new UIImageView(Theme.CellBackgroundFullActive); 

        } else if (indexPath.Row == 0) //top only
        {
            theCell.BackgroundView = new UIImageView(Theme.CellBackgroundTop);
            theCell.SelectedBackgroundView = new UIImageView(Theme.CellBackgroundTopActive); 

        } else if (indexPath.Row+1 == RowsInSection(tableView, indexPath.Section)) // bottom only
        {
            theCell.BackgroundView = new UIImageView(Theme.CellBackgroundBottom);
            theCell.SelectedBackgroundView = new UIImageView(Theme.CellBackgroundBottomActive); 
        } else //anything in the middle
        {
            theCell.BackgroundView = new UIImageView(Theme.CellBackgroundMiddle);
            theCell.SelectedBackgroundView = new UIImageView(Theme.CellBackgroundMiddleActive); 
        }
        return theCell;
    }
}
Theme只是一个返回UIImages的静态类,类似于Xamarin的示例Field Service应用程序。所以在这里我一共拍了8张照片。4表示元素的顶部、中部、底部和单独部分。每个都有不同的圆角以显示正确。然后一个“突出显示”版本的每一个当其触摸

这里最大的缺点是您必须为您需要的每个不同样式的控制器执行此操作。如果您同意修改MT.D源代码,您可以获得一个不同的解决方案,该解决方案将允许您在此处的小节级别对其进行控制:


这具有相同的效果,但您只需要为每个不同的样式对节进行子类化,这使得在一个根中包含多个样式变得更容易。对此更改提出了拉式请求,但米格尔倾向于第一种解决方案,如图所示:

根据我使用mt.dialog的经验,我几乎必须对需要定制的所有内容进行子类化。