Xamarin.Forms ListView, как установить RowHeight?

ListViewin Xamarin.Forms имеет свойство RowHeightproperty, но кажется, не имеет значения, какую высоту я его установил.

Я использую Visual Studio 2013, у меня есть лицензия на бизнес-версию для Xamarin, я использую эмулятор Android MonoForAndroid_API_15, и я считаю, что у меня последняя версия всего, что связано с этим. Я пока не могу запускать эмуляторы iOS или WinPhone, поэтому не могу сравнивать. Это просто проблема эмулятора Android или неправильно задано свойство RowHeight?

Вот мой унаследованный ContentPage (обратите внимание, что я установил RowHeight):

public class QuizzesPage : ContentPage
{
    private readonly ListView _listView;

    public QuizzesPage()
    {
        Title = "Test";
        NavigationPage.SetHasNavigationBar(this, true);
        _listView = new ListView {RowHeight = 20};
        Content = _listView;
    }

    protected async override void OnAppearing()
    {
        base.OnAppearing();
        _listView.ItemsSource = new[] {"One", "Two", "Three", "Four", "Five"};
    }
}

In App:

public class App
{
    public static Page GetMainPage()
    {
        return new NavigationPage(new QuizzesPage());
    }
}

И вот визуальный результат:

Проблема RowHeight эмулятора Androind

Обратите внимание, что мой код является упрощенной версией пример TODO, используемый Xamarin, где вы видите, как они устанавливают свойство RowHeight так же, как и я.

Независимо от того, что я установил как RowHeight, строки имеют одинаковую огромную высоту. Что я могу сделать?

Редактировать 1: я планирую перейти на Windows 8.1 на этой неделе, и тогда я смогу протестировать, как это выглядит на WinPhone. Чтобы добавить Mac в сеть на работе, мне сначала нужны разрешения. Вот почему я пока что придерживаюсь только эмулятора Android.

Редактировать 2: Я попытался установить для HasUnevenRows значение true, поскольку предлагается здесь, но это только заставило его принимать более длинные записи, а не изменять высоту (или шрифт) строки, что на мой вкус слишком велико.

Изменить 3: я опубликовал решение / обходной путь в качестве ответа. По крайней мере, я полностью контролирую высоту ячеек. Но RowHeight, похоже, мало что делает.


person Halvard    schedule 01.07.2014    source источник


Ответы (1)


Я получил это предложение:

Не уверен в RowHeight, но попробуйте установить для ListView.HasUnevenRows значение true. Затем вы можете указать высоту для своих ячеек. Возможно, установка этого логического значения также требуется при использовании RowHeight.

Это заставило меня понять, что мне нужно создать класс, наследующий от ViewCell, и привязать его к свойству класса:

public class QuizCell : ViewCell
{
    public QuizCell()
    {
        var label = new Label {HeightRequest = 20};
        label.SetBinding (Label.TextProperty, "Title");
        View = label;
    }
}

Чтобы использовать это, я изменил QuizzesPage на это:

public class QuizzesPage : ContentPage
{
    private readonly ListView _listView;

    public QuizzesPage()
    {
        Title = "Test";
        NavigationPage.SetHasNavigationBar(this, true);
        _listView = new ListView
                    {
                        HasUnevenRows = true,
                        ItemTemplate = new DataTemplate(typeof (QuizCell)),
                        //RowHeight = 10
                    };
        Content = _listView;
    }

    protected async override void OnAppearing()
    {
        base.OnAppearing();

        var quizEndpoint = new QuizEndpoint("Test");
        var quizzes =  await quizEndpoint.LoadAllAsync();
        _listView.ItemsSource = quizzes;
    }
}

Важные части здесь:

  1. ListViews ItemSource установлен в List<Quiz>, где объект Quiz имеет свойство Title (то, к которому я привязал Label).
  2. ListView устанавливает ItemTemplate метод равным new DataTemplate(typeof (QuizCell)), который является новым классом, который я создал.

Теперь я могу установить любую высоту строки, используя свойство HeightRequest компонента, используемого в классе, унаследованном от ViewCell.

Причина моих проблем заключалась в том, что я упростил пример TODO слишком много (и это RowHeight, похоже, не дает многого). Также, в заключение, это не имело отношения к эмулятору. Я надеюсь, что это помогает кому-то!

person Halvard    schedule 01.07.2014