Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Xamarin表单中自动调整iOS列表行的大小_C#_Ios_Xamarin_Xamarin.forms - Fatal编程技术网

C# 在Xamarin表单中自动调整iOS列表行的大小

C# 在Xamarin表单中自动调整iOS列表行的大小,c#,ios,xamarin,xamarin.forms,C#,Ios,Xamarin,Xamarin.forms,对于iOS,我在调整Xamarin表单的行大小方面遇到了问题。不过,我的代码在Android上运行得非常好。当我通过增加大小来调整iOS行的大小时,它将与下面的行重叠。通过谷歌搜索,我得到如下结果: 结果表明,由于性能问题,Xamarin表单没有实现这一点。我只发现了1年以上的结果,所以我不知道这是否仍然是原因 在我发现的不同线程中,我找到了许多不同的方法来解决这个问题,但都非常复杂 对我来说,在应用程序中,一个项目在选择时被展开是很常见的。我想知道这里是否有人能提出解决这个问题的方案?如果可能

对于iOS,我在调整Xamarin表单的行大小方面遇到了问题。不过,我的代码在Android上运行得非常好。当我通过增加大小来调整iOS行的大小时,它将与下面的行重叠。通过谷歌搜索,我得到如下结果:

结果表明,由于性能问题,Xamarin表单没有实现这一点。我只发现了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>
我将在下面发布列表视图的两张图片。第一张图片没有点击。第二张图片是在点击“二”之后。一个按钮出现在单元格内,但单元格与下面的单元格重叠(“三”)


我不确定为什么寿司宿醉没有同样的问题,但我得到的结果和你完全一样。默认情况下,我的也不会调整大小

无论您是希望使用他的建议更新项目,还是使用最初的方式更新项目,这都会强制您的单元格更新到正确的大小

更改您的
ViewCell
以处理点击

<ViewCell Tapped="Handle_Tapped">

for
ForceUpdateSize()
说要小心,因为它可能会很昂贵,但如果你想让它做你想要的事情,它肯定是最省力的。

对我来说很遗憾,ListView(或TableView)无法在iOS上动态调整列的高度(在Android works perfectty上)甚至调用ForceUpdateSize()方法。目前我正在使用Xamarin Forms 2.5.0

更荒谬的是,当我向下滚动,然后再向后滚动以再次显示它们时,这些单元格确实会调整到正确的高度(!)

经过大量的研究和测试,我决定改变方法:我在ScrollView中创建了一个StackLayout,并在StackLayout后面的代码中动态添加了ViewCell(我必须将其更改为ContentView)。这个主意是我从

这让我觉得这些集合视图还没有准备好用于这种类型的用例


自2014年以来,你会发现很多人都在遭受这种痛苦。例如:

根据您使用的版本,单元格上有一个
ForceUpdateSize
。该函数在我的版本上没有任何作用,但其他人说它可以工作。我想尝试一下,但我起诉的XAML与我的ViewModel完全分离,并且希望避免直接操纵GUI。这可以在不引用C#中实际列表的情况下触发吗?谢谢!!!我已经开始怀疑我的理智有一段时间了。这工作得很好。如何从视图模型调用ForceUpdateSize()?
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));
        }
    }
}
<ViewCell Tapped="Handle_Tapped">
void Handle_Tapped(object sender, System.EventArgs e)
{
    (sender as ViewCell).ForceUpdateSize();
}