4

私は Dialog を使用しており、すべてのセルのスタイルを設定したいと考えています。背景画像があります。サンプルでは、​​StyledStringElement を使用してその画像を使用する方法を確認できます。

ただし、実際の使用では、一部のセクションで他の要素を使用しています。たとえば、あるセクションの最後の要素は RootElement ですが、設定する BackgroundUri プロパティはありません。同じことがブール要素にも当てはまります。

この質問を見つけました -すべての monotouch.dialog TableViewCells を同じスタイル (背景など) にカスタマイズする最良の方法は何ですか? これは、1年半前の同様の質問です。上記の UIAppearance スタイリングはテーブルセル用に存在しますが、MTDialog では機能しません。これに対する krtrego の回答monotouch.dialog では、RootElement を簡単にスタイルできますか? 質問は仕事をすることを目的としていますが、実装したときにスタイリングは行われませんでした。

これを行うための改善された方法はありますか?これらの他のコントロール タイプの独自の「スタイル付き」バージョンを実装するのは大変な作業であり、styledstring 要素を見ると、これは私の現在のスキル レベルを超えています。

これは私が達成したいことの例です (「タグ」セルの下の影ですが、要素は実際にはその下にラジオ オプションのセットを持つ RootElement です)。デフォルトの灰色の線などを削除するのは簡単ですが、各セクションの一番下のセルに微妙な影を付けるのはうまくいきません。

どうもありがとう!

PS。セルの背景と境界線が削除された通常の MTDialog 画面では、各セクションの下に微妙な白い影/線がそのまま表示されます。色を変えることができれば、なりたい自分への道は遠い...

ここに画像の説明を入力

4

1 に答える 1

2

要素をサブクラス化すると、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 は代わりに最初のソリューションを支持しました

于 2013-08-13T14:00:52.850 に答える