4

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

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

我发现了这个问题 -将所有 monotouch.dialog TableViewCells 自定义为相同样式(背景等)的最佳方法是什么?这是一年半前的一个类似问题。提到的 UIAppearance 样式确实存在于表格单元中,但不适用于 MTDialog。krtrego 对此的回答在 monotouch.dialog 中可以轻松设置 RootElement 样式吗?问题声称可以完成这项工作,但在我实施它时没有出现任何样式。

现在有没有改进的方法来做到这一点?实现这些其他控件类型的我自己的“样式化”版本将是一项巨大的努力,并且查看 styledstringelement 这超出了我目前的技能水平。

这是我想要实现的示例(“标签”单元格下方的阴影,但该元素实际上是一个 RootElement,其下方有一组单选选项)。删除默认的灰线等很容易,但是在每个部分的底部单元格上放置一个微妙的阴影是我无法解决的。

非常感谢!

PS。在删除单元格背景和边框的普通 MTDialog 屏幕上,每个部分下方都有一条微妙的白色阴影/线条。如果我能重新着色,我将离我想去的地方还有很长的路要走……

在此处输入图像描述

4

1 回答 1

2

子类化元素将允许您通过覆盖 GetCell 方法来设置它的样式,但这会变得非常乏味。我遇到的最好的解决方案是通过继承它来制作一个自定义的 DialogViewController,并使用你自己的 SizingSource 和 GetCell() 方法覆盖 CreateSizingSource 方法,使用你想要的每个单元格场景的图像(顶部,中间,底部,独自的)。它有点代码,我的示例不会处理不均匀的行,但它是我见过的唯一不修改 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 源代码,您可以获得不同的解决方案,允许您在此处的部分级别控制它:http: //fastchicken.co.nz/2012/05/20/earnest-简报-视觉样式-in-ios-apps-uiappearence-custom-sections-in-monotouch-dialog/

这具有相同的效果,但是您只需要为每个不同的样式子类化 Section,这使得在一个 Root 中包含多个样式更容易。对此更改提出了拉取请求,但 Miguel 更喜欢第一个解决方案,见此处:https ://github.com/migueldeicaza/MonoTouch.Dialog/pull/180

于 2013-08-13T14:00:52.850 回答