自动调整Xamarin Forms中iOS的列表行的大小

why_vincent

对于iOS,我在调整Xamarin Forms的行大小时遇到​​问题。我的代码虽然在Android上运行良好。当我通过增加大小来调整iOS行的大小时,它将与下面的行重叠。谷歌搜索给我这样的结果:http : //forums.xamarin.com/discussion/comment/67627/#Comment_67627

结果声称,由于性能问题,Xamarin Forms尚未实现此目的。我只发现1年以上的结果,所以我不知道这是否仍然是原因。

我在发现的不同线程中找到了多种解决方法,但都非常复杂。

对我来说,在应用程序中很常见的是,选择时会展开一个项目。我想知道这里是否有人可以提出解决方案?如果可能的话,我真的想避免一遍又一遍地重新计算精确的高度。我应该使用Xamarin.iOS和依赖项注入来注入自定义列表吗?

我将在此处发布XAML,但XAML可能不是问题,因为它在Android上运行正常。

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="simpletest.PlayGroundPage">
    <ContentPage.Content>
        <StackLayout>
            <ListView VerticalOptions="FillAndExpand" HasUnevenRows="True" SeparatorVisibility="None" ItemsSource="{Binding AllItems}" SelectedItem="{Binding MySelectedItem}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <StackLayout VerticalOptions="FillAndExpand">
                                <Label Text="{Binding MyText}" />
                                <Button Text="button1" IsVisible="{Binding IsExtraControlsVisible}" />
                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

我的表单项目包:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="FreshEssentials" version="2.0.1" targetFramework="portable-net45+win+wp80+MonoTouch10+MonoAndroid10+xamarinmac20+xamarintvos10+xamarinwatchos10+xamarinios10" />
  <package id="Xamarin.Forms" version="2.3.1.114" targetFramework="portable-net45+win+wp80+MonoTouch10+MonoAndroid10+xamarinmac20+xamarintvos10+xamarinwatchos10+xamarinios10" />
</packages>

这是我的视图模型。

public class PlayGroundViewModel : INotifyPropertyChanged
{

    private Item _mySelectedItem;
    private ObservableCollection<Item> _allItems;

    public PlayGroundViewModel(ObservableCollection<Item> allItems)
    {
        AllItems = allItems;
        MySelectedItem = allItems.First();

        ItemClicked = (obj) => { ExpandRow(obj); };

    }

    public ObservableCollection<Item> AllItems { get { return _allItems; } set { _allItems = value; SetChangedProperty("AllItems"); } }

    public Action<Item> ItemClicked { get; private set; }

    public Item MySelectedItem
    {
        get { return _mySelectedItem; }
        set { _mySelectedItem = value; SetChangedProperty("MySelectedItem"); }
    }

    private void ExpandRow(Item item)
    {
        foreach (Item x in AllItems)
        {
            x.IsExtraControlsVisible = false;
        }

        if (item != null)
        {
            item.IsExtraControlsVisible = true;
        }

        SetChangedProperty("MySelectedItem");
        SetChangedProperty("AllItems");
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void SetChangedProperty(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

}

代码背后:

    public PlayGroundPage()
    {
        InitializeComponent();
        ObservableCollection<Item> items = new ObservableCollection<Item>();
        items.Add(new Item("One"));
        items.Add(new Item("Two"));
        items.Add(new Item("Three"));

        PlayGroundViewModel viewModel = new PlayGroundViewModel(items);
        BindingContext = viewModel;
        Action<Item> itemClickedAction = viewModel.ItemClicked;
        ItemList.ItemTapped += (object sender, ItemTappedEventArgs e) =>
          {
              Item item = (Item)e.Item;
              itemClickedAction.Invoke(item);
          };
    }
}

项目:

public class Item : INotifyPropertyChanged
{


    public Item(string text)
    {
        _myText = text;
        _isExtraControlsVisible = false;
    }

    private string _myText;
    private bool _isExtraControlsVisible;

    public event PropertyChangedEventHandler PropertyChanged;


    public string MyText
    {
        get { return _myText; }
        set { _myText = value; OnPropertyChanged("MyText"); }
    }

    public bool IsExtraControlsVisible
    {
        get { return _isExtraControlsVisible; }
        set { _isExtraControlsVisible = value; OnPropertyChanged("IsExtraControlsVisible"); }
    }

    private void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

我将在列表视图的下方发布两张图片。第一幅图片没有单击。第二张图片是在单击“两个”之后。一个按钮出现在该单元格内,但该单元格与下面的单元格重叠(“三”)。

未点击

已点击

泰坎

我不知道为什么SushiHangover没有相同的问题,但是我得到的结果与您完全一样。默认情况下,我也不会调整大小。

无论您是要使用他的建议来更新项目,还是使用您最初的方式,这都应强制将单元格更新为正确的大小。

更改ViewCell以处理水龙头。

<ViewCell Tapped="Handle_Tapped">

然后在您的xaml页面的代码隐藏中

void Handle_Tapped(object sender, System.EventArgs e)
{
    (sender as ViewCell).ForceUpdateSize();
}

文档ForceUpdateSize()说要小心,因为它可以是昂贵的,但如果它肯定会成为的努力得到它做你要找的内容最少。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在 xamarin ios 中自动调整 UITableView 的行高

来自分类Dev

为什么布局不会自动调整大小以适应 Xamarin Forms UWP 应用中的窗口?

来自分类Dev

在WrapPanel中自动调整大小?

来自分类Dev

在Irfanview中自动调整大小

来自分类Dev

自动调整ScrollPane的大小

来自分类Dev

自动调整大小的棋盘

来自分类Dev

自动调整IFrame的大小

来自分类Dev

UIImageView自动调整大小

来自分类Dev

自动调整大小的 css

来自分类Dev

如何在Xamarin.Forms中调整Horizontal ListView的大小?

来自分类Dev

在 Xamarin Forms 中按比例调整框视图大小的动画

来自分类Dev

Xamarin Forms:根据条件调整列表视图行高

来自分类Dev

列表框无法在Tkinter中自动调整大小(python)

来自分类Dev

调整窗口大小时自动调整TableLayoutPanel行的大小

来自分类Dev

iOS UITextField自动调整大小符合内容

来自分类Dev

iOS 自动调整大小的容器视图

来自分类Dev

自动调整大小/调整用户表单

来自分类Dev

DataGridView列自动调整宽度并调整大小

来自分类Dev

iOS 8中的自动调整大小的单元格和动态类型不会调整大小

来自分类Dev

如何自动调整扩展行的大小?

来自分类Dev

自动调整Swing组件的大小

来自分类Dev

自动调整div标签的大小

来自分类Dev

自动调整闪亮的rChart的大小

来自分类Dev

自动调整Swing组件的大小

来自分类Dev

自动水平调整大小

来自分类Dev

JavaFX FlowPane自动调整大小

来自分类Dev

自动调整嵌套div的大小

来自分类Dev

自动调整大小UILabel文字

来自分类Dev

根据设备自动调整大小