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").
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
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#? –