2016-08-03 2 views
12

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").

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

ForceUpdateSize()documentation 비싼 수 있기 때문에, 그것에주의를 말한다,하지만 코드 숨김에서 확실히 가장이 될 것 경우 당신이 찾고있는 것을하기위한 노력의 양.

+0

감사합니다 !!! 나는 잠시 동안 나의 정신을 질문하기 시작하고있다. 이것은 완벽하게 작동합니다. –

+0

보기 모델에서 ForceUpdateSize()를 어떻게 호출 하시겠습니까? – Csharpest

관련 문제