2016-08-03 44 views
12

我在调整Xamarin Forms的行大小时遇到​​了iOS问题。尽管我的代码在Android上完美工作。当我通过增加尺寸来调整iOS的行大小时,它将与下面的行重叠。谷歌搜索这给了我这样的结果:http://forums.xamarin.com/discussion/comment/67627/#Comment_67627在Xamarin Forms中自动调整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> 

我对形式的项目包:

<?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)); 
     } 
    } 
} 

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

Unclicked

Clicked

+0

根据您使用的是哪个版本,单元格上有一个'ForceUpdateSize'。该功能对我的版本没有任何作用,但其他人已经说过它的作用。 – Taekahn

+0

我想尝试,但我起诉XAML完全与我的ViewModel分开,并希望避免直接操纵GUI。这可以在不引用C#中的实际列表的情况下触发? –

回答

8

我不知道为什么SushiHangover不会有同样的问题,但我得到你做同样的结果。默认情况下,我也不会调整大小。

无论您是否想要使用他的建议更新项目,或者使用您最初的方式,这应该强制您的单元格更新到正确的大小。

更改您的ViewCell以处理水龙头。

<ViewCell Tapped="Handle_Tapped"> 

然后在代码隐藏您的XAML页面

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

documentationForceUpdateSize()说要小心,因为它可以是昂贵的,但如果它肯定会是最努力让它做你正在寻找的东西。

+0

谢谢你!现在我已经开始质疑我的理智了。这是完美的。 –

+0

如何从视图模型调用ForceUpdateSize()? – Csharpest