Xamarin.Forms - 强制重绘 ListView 布局
Xamarin.Forms - Force ListView layout to redraw
我有一个带有 HasUnevenRows = true
的 ListView,其中每个单元格的内容开始时都是不同的,但内容也可以动态更改(通过单击单元格中的按钮)。当 ListView 初始加载时,系统必须执行计算,以便根据内容正确确定和绘制每个单元格的高度。
但是当我在初始加载后更新内容时,同样的计算显然没有完成,因为单元格的高度不会改变——直到我滚动该项目在视野之外,然后又回到视野。
如何在不完全刷新 ListView 的情况下强制执行相同的计算并手动重绘??
我尝试将 ListView 包装在框架中并在框架上调用 .ForceLayout()
,但没有成功。
如果您希望视图自动刷新,则必须使用 DataBinding..
YourListView.BeginRefresh ();
YourListView.EndRefresh ();
但我强烈建议不要这样做。
重绘本机控件让我很不走运。对我有用的一件事是在自定义渲染器中:((IVisualElementController)Element).NativeSizeChanged()
默认情况下不会重新计算单元格的高度,因为这是一个昂贵的过程。如果您想强制调整大小,您需要在单元格上调用 ForceUpdateSize()。
注意:这不适用于旧版本的 Xamarin Forms。它是在 2.0.0.0 中添加的,但请尝试至少更新到 2.2.0.31
设置你的 CachingStrategy="RetainElement",它很昂贵,但会强制更新很多。如果您的列表不太长,您将不会注意到。
我注意到如果一个单元格可见,即使绑定到一个可观察的集合,该单元格也不会更新,直到我向上滚动然后向下滚动。
最简单有效的方法是:
myListView.ItemsSource = null;
MyListView.ItemsSource = myObservableCollection;
我有一个带有 HasUnevenRows = true
的 ListView,其中每个单元格的内容开始时都是不同的,但内容也可以动态更改(通过单击单元格中的按钮)。当 ListView 初始加载时,系统必须执行计算,以便根据内容正确确定和绘制每个单元格的高度。
但是当我在初始加载后更新内容时,同样的计算显然没有完成,因为单元格的高度不会改变——直到我滚动该项目在视野之外,然后又回到视野。
如何在不完全刷新 ListView 的情况下强制执行相同的计算并手动重绘??
我尝试将 ListView 包装在框架中并在框架上调用 .ForceLayout()
,但没有成功。
如果您希望视图自动刷新,则必须使用 DataBinding..
YourListView.BeginRefresh ();
YourListView.EndRefresh ();
但我强烈建议不要这样做。
重绘本机控件让我很不走运。对我有用的一件事是在自定义渲染器中:((IVisualElementController)Element).NativeSizeChanged()
默认情况下不会重新计算单元格的高度,因为这是一个昂贵的过程。如果您想强制调整大小,您需要在单元格上调用 ForceUpdateSize()。
注意:这不适用于旧版本的 Xamarin Forms。它是在 2.0.0.0 中添加的,但请尝试至少更新到 2.2.0.31
设置你的 CachingStrategy="RetainElement",它很昂贵,但会强制更新很多。如果您的列表不太长,您将不会注意到。
我注意到如果一个单元格可见,即使绑定到一个可观察的集合,该单元格也不会更新,直到我向上滚动然后向下滚动。
最简单有效的方法是:
myListView.ItemsSource = null;
MyListView.ItemsSource = myObservableCollection;