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

#android-emulator #xamarin.forms

#android-эмулятор #xamarin.forms

Вопрос:

ListView в Xamarin.У Forms есть RowHeight свойство, но, похоже, неважно, на какую высоту я его установил.

Я использую Visual Studio 2013, у меня есть лицензия business Edition для 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"};
    }
}
  

В App :

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

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

Проблема с высотой строки в эмуляторе Android

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

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

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

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

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

Ответ №1:

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

Не уверен насчет высоты строки, но попробуйте установить ListView.Имеет значение true для unevenrows. Затем вы можете указать высоту для своих ячеек. Может быть, что установка этого bool также требуется при использовании 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. ListView S ItemSource устанавливается в значение, List<Quiz> где Quiz объект имеет Title свойство (то, к которому я привязал Label ).
  2. ListView Устанавливает ItemTemplate метод it в new DataTemplate(typeof (QuizCell)) , который является новым классом, который я создал.

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

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