要素をサブクラス化すると、GetCell メソッドをオーバーライドしてスタイルを設定できますが、これはかなり面倒です。私が遭遇した最善の解決策は、カスタム DialogViewController をサブクラス化し、CreateSizingSource メソッドを独自の SizingSource および GetCell() メソッドでオーバーライドして、セルの各シナリオ (上、中、下、 1人)。その少しのコードと私の例では不均一な行を処理できませんが、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 は、Xamarin の Field Service アプリの例と同様に、UIImages を返す単なる静的クラスです。というわけで、合計8枚の画像を作成しました。要素の上部、中央部、下部、および単独を表す 4。正しく表示されるように、それぞれの角が丸くなっています。そして、触れたときのそれぞれの「強調表示された」バージョン。
ここでの大きな欠点は、必要なさまざまなスタイルのコントローラーごとにこれを行う必要があることです。MT.D ソース コードを変更しても問題ない場合は、次のセクション レベルでそれを制御できる別のソリューションを入手できます: http://fastchicken.co.nz/2012/05/20/earnest- debrief-visual-styles-in-ios-apps-uiappearence-custom-sections-in-monotouch-dialog/
これは同じ効果がありますが、異なるスタイルごとに Section をサブクラス化するだけで済みます。これにより、1 つのルートに複数のスタイルを簡単に含めることができます。この変更に対してプル リクエストが行われましたが、Miguel は代わりに最初のソリューションを支持しました。