Xamarin.Forms ListView,如何设置RowHeight?

时间:2014-07-01 07:36:25

标签: android-emulator xamarin.forms

Xamarin.Forms中的ListView具有RowHeight属性,但似乎无论我将其设置为什么高度。

我使用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"};
    }
}

App

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

这是视觉效果:

Androind emulator RowHeight problem

请注意,我的代码是the TODO example used by Xamarin的简化版本,您可以看到它们以与我相同的方式设置RowHeight属性。

无论我设置为RowHeight,行都具有相同的巨大高度。我该怎么办?

编辑1:我计划本周升级到Windows 8.1,然后可以测试它在WinPhone上的外观。要在工作中将Mac添加到网络,我首先需要一些权限。这就是为什么我现在只能使用Android模拟器了。

编辑2 我尝试将HasUnevenRows设置为true,为suggested here,但这只会让它接受更长的条目,而不是更改高度(或字体)排,这对我来说太大了。

编辑3:我发布了解决方案/解决方法作为答案。至少我可以完全控制细胞的高度。但是RowHeight似乎并不多。

1 个答案:

答案 0 :(得分:6)

我得到this suggestion

  

不确定RowHeight但尝试将ListView.HasUnevenRows设置为true。然后,您可以指定单元格的高度。可能是在使用RowHeight时也需要设置此bool。

这让我意识到我必须创建一个继承自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的属性} to)。
  2. ListViewItemTemplate方法设置为new DataTemplate(typeof (QuizCell)),这是我创建的新类。
  3. 现在我可以使用继承自HeightRequest的类中使用的组件的ViewCell属性将高度设置为我想要的任何行。

    我遇到问题的原因是我简化了the TODO example(并且RowHeight似乎没有做多少)。最后,这与模拟器无关。我希望这有助于某人!