#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());
}
}
И это визуальный результат:
Обратите внимание, что мой код представляет собой упрощенную версию примера 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;
}
}
Важными частями здесь являются:
ListView
SItemSource
устанавливается в значение,List<Quiz>
гдеQuiz
объект имеетTitle
свойство (то, к которому я привязалLabel
).ListView
УстанавливаетItemTemplate
метод it вnew DataTemplate(typeof (QuizCell))
, который является новым классом, который я создал.
Теперь я могу установить высоту строки на все, что захочу, используя HeightRequest
свойство компонента, используемого в классе, унаследованном от ViewCell
.
Причина моих проблем заключалась в том, что я слишком сильно упростил пример TODO (и это RowHeight
, похоже, мало что дает). Также, в заключение, это не имело никакого отношения к эмулятору. Я надеюсь, что это кому-то поможет!