【发布时间】:2018-08-28 19:01:43
【问题描述】:
我正在使用 Xamarin Forms XAML 编写应用程序,我需要一种方法来重绘视图。
我有一个包含多个标签和一个 ListView 的布局。我还有一个按钮,当按下该按钮时,它会调用 API 以下载一组新数据,这些数据需要更新页面上的控件。
我的所有控件都正确绑定,因此当后台数据更新时,视图上的数据会更新,但控件不会重绘,因此会打乱布局的外观。
有时我的 ListView 中的数据可能只有 1 或 2 行,但通常会更多。第一次绘制页面时,一切看起来都很好,但我的问题是使用 ListView 中具有不同行数的数据更新视图时,因为控件不会调整大小。
例子:
当我第一次进入屏幕时,我下载数据,ListView 有 10 个项目,因此在屏幕上绘制了 10 行
当我按下“重新加载数据”按钮时,下载的数据现在可能只包含 2 个项目。数据已正确更新,但屏幕上的间距仍与第一次绘制时相同(包含 10 个项目),所以我现在有一个很大的空白区域。
如果做这个例子的反面(第一个条目是 2 个条目,第二个条目是 10 个条目),那么 ListView 的空间仍然只有 2 个条目高,因此您只能看到 10 个条目中的 2 个。
我想要做的是在下载新数据时以某种方式刷新控件,以便重新绘制 ListView 的大小,并且始终是显示项目数量的正确大小。
【问题讨论】:
-
您是否确保这些更新发生在 UI 线程上?
-
@Cheesebaron 我该如何检查?众所周知,如果我在 ViewModel 中设置一个断点,我会看到我的绑定控件得到更新,然后当我实际测试代码时,显示的数据确实反映了已下载的内容。问题纯粹与控件的大小有关。第一个条目总是正确的,但每当下载一组具有不同项目数量的新数据时,控件就不会调整大小。
-
检查
Thread.CurrentThread.ManagedThreadId如果它不是 1 那么它通常不是 UI 线程。如果您正在执行异步操作,您可以使用ConfigureAwait在等待的任务上控制行为。您需要为我们发布更多代码,以便更好地帮助您在这里做什么。 -
看看你的代码和 XAML 会很有帮助,或者至少是 minimal reproducible example。
-
如果您不使用 ListView 的 HasUnEvenRows,这意味着您为所有 ListView ViewCells 设置了固定大小的行高。您可以根据 Total Items 在 ViewModel 中操作 ListView 的总高度,您可以乘以该总高度并绑定 ListView 的高度。
标签: c# xamarin xamarin.forms redraw