2016-08-03 6 views
12

iOSについては、Xamarinフォームの行のサイズを変更する際に問題が発生します。私のコードはAndroidでも完璧に動作します。サイズを大きくしてiOSの行のサイズを変更すると、下の行が重なります。これは私を与えるグーグルでは、このような結果:http://forums.xamarin.com/discussion/comment/67627/#Comment_67627XamarinフォームのiOSのリスト行のサイズを自動的に変更します。

結果はXamarinフォームが原因のパフォーマンスの問題にこれを実装していないと主張しています。私は1歳以上の結果しか見つけられないので、まだこれが理由であるかどうかはわかりません。

は、私が発見した別のスレッドでこれを解決するために、いくつかの異なる方法を見つけることだが、すべては非常に複雑です。

私の場合、アイテムの選択時にアイテムが展開されることは、アプリではよくあることです。私はここに誰かがこれを解決する解決策を提案できるかどうか疑問に思っていた?可能であれば、正確な高さを何度も再計算することを避けたいと思っています。 Xamarin.iOSと依存関係注入を使用してカスタムリストを注入すべきですか?

私はここに私のXAMLを投稿しますが、それは、Android上でうまく働いているので、XAMLはおそらく問題ではありません。

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

は私のviewmodelです。

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

私は、リストビューの下の2枚の写真を投稿します。最初の画像はクリックされません。 2番目の画像は「2」をクリックした後です。セル内にボタンが表示されますが、セルは下のセル(「3」)と重なります。

Unclicked

Clicked

+0

使用しているバージョンによっては、セルに 'ForceUpdateSize'があります。この関数は私のバージョンでは何もしませんが、他の人はそれが動作すると言っています。 – Taekahn

+0

私はそれを試してみたいですが、私はViewModelから完全に分離したXAMLを訴えており、GUIを直接操作しないようにしたいと考えています。 C#で実際のリストを参照せずにこれを起動できますか? –

答えて

8

SushiHangoverは同じ問題を持っていない私はなぜわからないんだけど、私はあなたが正確に同じ結果が得られます。デフォルトでは、私のサイズは変更されません。

にかかわらず、あなたがアイテムを更新するには、彼の提案を使用する、または最初にそれをやった方法を使用したい場合は、これが正しいサイズに更新するために、あなたの細胞を強制する必要があるの。

タップを処理するようにViewCellを変更してください。

コードビハインドあなたのXAMLページ用

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

ForceUpdateSize()ためdocumentationはそれは高価なことができますので、それに注意すると言うが、それは確かに少なくなるだろう場合で、その後

<ViewCell Tapped="Handle_Tapped"> 

あなたが探していることをするための努力の量。

+0

ありがとうございました!私はしばらくの間、私の正気に疑問を持ち始めています。これは完全に機能しています。 –

+0

ビューモデルからどのようにForceUpdateSize()を呼び出しますか? – Csharpest

関連する問題