iOS의 경우 Xamarin Forms 행의 크기를 조정하는 데 문제가 있습니다. 내 코드는 Android에서도 완벽하게 작동합니다. 크기를 늘려 iOS 행의 크기를 조정하면 아래 행이 겹칩니다. Google 검색 결과는 다음과 같습니다. http://forums.xamarin.com/discussion/comment/67627/#Comment_67627Xamarin Forms의 iOS 용 목록 행의 크기를 자동으로 조정합니다.
결과에 따르면 성능상의 문제로 인해 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));
}
}
}
내가 목록보기의 아래 두 사진을 게시합니다. 첫 번째 사진은 클릭하지 않고 있습니다. 두 번째 사진은 "두"를 클릭 한 후입니다. 셀 내에 단추가 있지만 셀은 아래 셀과 겹칩니다 ("Three").
사용중인 버전에 따라 셀에'ForceUpdateSize'가 있습니다. 이 함수는 내 버전에서는 아무 일도하지 않지만 다른 사람들은 작동한다고 말했다. – Taekahn
나는 그것을 시도하고 싶습니다만, XAML을 완전히 ViewModel과 분리 해두고 GUI를 직접 조작하는 것을 피하고 싶습니다. C#에서 실제 목록을 참조하지 않고 트리거 될 수 있습니까? –