我正在尝试显示包含使用自定义iOS渲染器渲染的单元格的列表视图。滚动列表时,会出现令人讨厌的叠加层(如下所示)。我把它归结为以下几行代码。
App
包含ListView
,其ItemsSource
设置为从A到Z的所有字符的虚拟列表。ItemTemplate
是使用自定义{{1}创建的下面定义。
ItemCell
public class App : Application
{
public App()
{
MainPage = new ContentPage {
Content = new ListView {
ItemsSource = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(),
ItemTemplate = new DataTemplate(typeof(ItemCell)),
},
};
}
}
包含绑定到列表项的ItemCell
。
Label
在iOS上,使用以下public class ItemCell: ViewCell
{
public ItemCell()
{
View = new Label();
View.SetBinding(Label.TextProperty, ".");
}
}
呈现Label
。它设置了一个由FixedLabelRenderer
表示的包含UILabel
的{{1}}的本机控件。
Element
现在的问题是,显然,当重用单元格时,控件不会被删除,而只会创建一个新控件。所以我得到了下面屏幕截图中显示的叠加层。
(左:滚动前,右:滚动后)
有趣的是,这个问题不会发生在Xamarin.Forms 1.2.3或1.3.1中,而是1.3.5和1.4.0。
答案 0 :(得分:-1)
哦,我找到了解决方案on the Xamarin Forum:
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
if (Control == null)
SetNativeControl(new UILabel());
if (e.NewElement != null)
Control.Text = e.NewElement.Text;
}
所以基本上你需要确保只创建一个 UILabel
并在之后重复使用它。