#.net #xaml #xamarin #xamarin.forms #xamarin.android
Вопрос:
Поэтому я работаю над приложением, которое будет отображать примерно 25 элементов в a ListView
. Когда приложение загружается, первые три элемента загружаются просто отлично, но 4-й и некоторые другие полностью белые и даже не становятся того цвета, каким они должны быть. если я прокручу список вниз и пару раз сделаю резервную копию, все они станут белыми и никогда не вернутся к своему первоначальному цвету. Почему это так и что я могу сделать, чтобы предотвратить это? Должен ли я использовать другой элемент управления для отображения элементов?
Я установил для некоторых свойств пустые строки, потому что не хочу делиться этими данными с общественностью. Это никак не влияет на пример, привязка работает идеально, как и должно быть.
Вот как это выглядит
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:viewModel="clr-namespace:MaterialDesign.MVVM.ViewModel"
x:Class="MaterialDesign.MainPage">
<ContentPage.BindingContext>
<viewModel:HomeViewModel/>
</ContentPage.BindingContext>
<StackLayout Background="#282828">
<ListView ItemsSource="{Binding Items}"
HasUnevenRows="True"
Margin="0,10,0,0">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Frame Background="#302E2E"
Margin="10,10,10,20"
Padding="0"
CornerRadius="4">
<StackLayout>
<Image HeightRequest="200"
Source="{Binding ThePicture}"
Aspect="Fill"
IsAnimationPlaying="True"/>
<StackLayout Margin="10">
<Label Text="{Binding Name}"
TextColor="#F9F9F9"
FontFamily="RobotoRegular"
Margin="5,0,0,0"/>
<Label Text="{Binding Name}"
TextColor="#F9F9F9"
FontFamily="RobotoRegular"
Margin="5,0,0,0"/>
<Label Text="{Binding Name}"
FontFamily="RobotoMedium"
FontSize="20"
TextColor="#F9F9F9"
Margin="5,0,0,0"/>
<Label Text="{Binding Name}"
FontFamily="RobotoMedium"
FontSize="20"
TextColor="#F9F9F9"
Margin="5,0,0,0"/>
<Label Text="{Binding Name}"
TextColor="#929292"
FontFamily="RobotoRegular"
Margin="5,0,0,0"/>
<FlexLayout BindableLayout.ItemsSource="{Binding Names}"
BindableLayout.ItemTemplate="{StaticResource T}"
Wrap="Wrap"
Direction="row"
FlowDirection="LeftToRight"
AlignItems="Start"
AlignContent="Start"
Padding="0"
Margin="0">
</FlexLayout>
</StackLayout>
</StackLayout>
</Frame>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
Комментарии:
1. Не могли бы вы также опубликовать код о «предметах» позади? Также можно было бы провести тест с 5 или 6 статическими элементами в списке, чтобы увидеть результат.
2. посмотрите на настройки кэширования для ListView и подумайте о переключении на CollectionView
3. Привет, установите CachingStrategy=»RecycleElement»
4. Попробуйте заменить элемент управления кадром сеткой. Каждый раз, когда я использую фрейм, у меня возникают проблемы с пользовательским интерфейсом.
Ответ №1:
Не используйте управление кадром.
Попробуйте выполнить следующий код с помощью https://github.com/sthewissen/Xamarin.Формы.Блинный вид
xmlns:yummy="clr-namespace:Xamarin.Forms.PancakeView;assembly=Xamarin.Forms.PancakeView"
<yummy:PancakeView
Background="#302E2E"
Margin="10,10,10,20"
Padding="0"
CornerRadius="4">
<StackLayout>
<Image HeightRequest="200"
Source="{Binding ThePicture}"
Aspect="Fill"
IsAnimationPlaying="True"/>
<StackLayout Margin="10">
<Label Text="{Binding Name}"
TextColor="#F9F9F9"
FontFamily="RobotoRegular"
Margin="5,0,0,0"/>
<Label Text="{Binding Name}"
TextColor="#F9F9F9"
FontFamily="RobotoRegular"
Margin="5,0,0,0"/>
<Label Text="{Binding Name}"
FontFamily="RobotoMedium"
FontSize="20"
TextColor="#F9F9F9"
Margin="5,0,0,0"/>
<Label Text="{Binding Name}"
FontFamily="RobotoMedium"
FontSize="20"
TextColor="#F9F9F9"
Margin="5,0,0,0"/>
<Label Text="{Binding Name}"
TextColor="#929292"
FontFamily="RobotoRegular"
Margin="5,0,0,0"/>
<FlexLayout BindableLayout.ItemsSource="{Binding Names}"
BindableLayout.ItemTemplate="{StaticResource T}"
Wrap="Wrap"
Direction="row"
FlowDirection="LeftToRight"
AlignItems="Start"
AlignContent="Start"
Padding="0"
Margin="0">
</FlexLayout>
</StackLayout>
</StackLayout>
</yummy:PancakeView>
Ответ №2:
Вы можете просто использовать ListView в качестве ретранслятора. Вам не нужны накладные расходы на представление списка. Вы можете прочитать больше здесь
<StackLayout BindableLayout.ItemsSource="{Binding Items}"
Margin="0,10,0,0">
<BindableLayout.ItemTemplate>
<DataTemplate>
<Frame Background="#302E2E"
Margin="10,10,10,20"
Padding="0"
CornerRadius="4">
<StackLayout>
<Image HeightRequest="200"
Source="{Binding ThePicture}"
Aspect="Fill"
IsAnimationPlaying="True"/>
<StackLayout Margin="10">
<Label Text="{Binding Name}"
TextColor="#F9F9F9"
FontFamily="RobotoRegular"
Margin="5,0,0,0"/>
<Label Text="{Binding Name}"
TextColor="#F9F9F9"
FontFamily="RobotoRegular"
Margin="5,0,0,0"/>
<Label Text="{Binding Name}"
FontFamily="RobotoMedium"
FontSize="20"
TextColor="#F9F9F9"
Margin="5,0,0,0"/>
<Label Text="{Binding Name}"
FontFamily="RobotoMedium"
FontSize="20"
TextColor="#F9F9F9"
Margin="5,0,0,0"/>
<Label Text="{Binding Name}"
TextColor="#929292"
FontFamily="RobotoRegular"
Margin="5,0,0,0"/>
<FlexLayout BindableLayout.ItemsSource="{Binding Names}"
BindableLayout.ItemTemplate="{StaticResource T}"
Wrap="Wrap"
Direction="row"
FlowDirection="LeftToRight"
AlignItems="Start"
AlignContent="Start"
Padding="0"
Margin="0">
</FlexLayout>
</StackLayout>
</StackLayout>
</Frame>
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>