2016-08-03 27 views
12

Tôi gặp sự cố với việc định lại kích thước hàng cho Biểu mẫu Xamarin khi nói đến iOS. Mã của tôi hoạt động hoàn hảo trên Android. Khi tôi thay đổi kích thước hàng cho iOS bằng cách tăng kích thước, sau đó nó sẽ chồng lên hàng bên dưới. Googling điều này mang lại cho tôi kết quả như sau: http://forums.xamarin.com/discussion/comment/67627/#Comment_67627Tự động thay đổi kích thước hàng danh sách cho iOS ở dạng Xamarin

Kết quả cho rằng biểu mẫu Xamarin chưa thực hiện điều này do các vấn đề về hiệu suất. Tôi chỉ tìm thấy kết quả từ 1 tuổi trở lên nên tôi không biết liệu đây có phải là lý do hay không.

Tôi đang tìm một số cách khác nhau để giải quyết vấn đề này trong các chủ đề khác nhau mà tôi đã phát hiện nhưng tất cả đều khá phức tạp.

Đối với tôi, điều này rất phổ biến trong các ứng dụng khi một mục được mở rộng khi lựa chọn. Tôi đã tự hỏi nếu có ai ở đây có thể đề xuất một giải pháp sẽ giải quyết vấn đề này? Nếu có thể thì tôi thực sự muốn tránh tính toán lại chiều cao chính xác nhiều lần. Tôi có nên tiêm một danh sách tùy chỉnh bằng cách sử dụng Xamarin.iOS và tiêm phụ thuộc không?

Tôi sẽ đăng XAML của mình ở đây nhưng XAML có thể không phải là vấn đề vì nó hoạt động tốt trên 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> 

gói của tôi cho dự án hình thức:

<?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> 

Đây là viewmodel của tôi.

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

} 

CodeBehind:

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

Các 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)); 
     } 
    } 
} 

tôi sẽ đăng hai hình ảnh dưới đây của một danh sách xem. Hình ảnh đầu tiên là không cần nhấp. Bức ảnh thứ hai là sau khi đã nhấp vào "Hai". Một nút xuất hiện bên trong ô nhưng ô chồng lên ô bên dưới ("Ba").

Unclicked

Clicked

+0

Tùy thuộc vào phiên bản bạn đang sử dụng, Có 'ForceUpdateSize' trên ô. Chức năng này không có gì trên phiên bản của tôi, nhưng những người khác đã nói rằng nó hoạt động. – Taekahn

+0

Tôi muốn thử điều đó nhưng tôi đang kiện XAML hoàn toàn tách biệt khỏi ViewModel của tôi và muốn tránh thao tác trực tiếp GUI. Điều này có thể được kích hoạt mà không tham khảo danh sách thực tế trong C#? –

Trả lời

8

Tôi không chắc chắn lý do tại sao SushiHangover không có cùng một vấn đề, nhưng tôi nhận được kết quả chính xác cùng mà bạn làm. Theo mặc định, tôi cũng không thay đổi kích thước.

Bất kể bạn muốn sử dụng đề xuất của mình về cập nhật mục hay sử dụng cách bạn đã làm, điều này sẽ buộc các ô của bạn cập nhật đúng kích thước.

Thay đổi ViewCell để xử lý một lần nhấn.

<ViewCell Tapped="Handle_Tapped"> 

sau đó trong code-behind cho trang XAML của bạn

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

Các documentation cho ForceUpdateSize() nói phải cẩn thận với nó, bởi vì nó có thể tốn kém, nhưng nếu nó chắc chắn sẽ là ít nhất số lượng nỗ lực để làm cho nó để làm những gì bạn đang tìm kiếm.

+0

Cảm ơn bạn !!! Tôi đã bắt đầu đặt câu hỏi về sự tỉnh táo của tôi trong một thời gian. Điều này hoạt động hoàn hảo. –

+0

Bạn sẽ gọi cho ForceUpdateSize() từ mô hình xem như thế nào? – Csharpest

Các vấn đề liên quan