【问题标题】:Xamarin Forms - Redraw viewXamarin Forms - 重绘视图
【发布时间】: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


【解决方案1】:

有同样的问题。我认为你接近它是错误的。 ListView 不像你想象的那样工作。它的设计并不总是完全适合它的内容。如果需要,您需要自己计算高度并将其设置为ListView

一种方法是更改​​ListView 的高度。您可以通过将属性绑定到HeightRequest 来实现:

<ListView
  HeightRequest="{Binding ListViewHeight}">
</ListView>

这是我对ListViewHeight 的计算。 RowHeight 对于 Android 是 72,对于 iOS 是 75。由于高度的硬编码值,这是一个肮脏的解决方案,但它是我为该问题找到的最佳解决方案。请记住,您需要调整这些值以满足您的需求,否则您的 ListView 可能太小/太高。

public double ListViewHeight
{
    get
    {
        if (MyItemsList!= null)
        {
            double listViewHeight = MyItemsList.Count * RowHeight;
            if (CanLoadMoreNotifications)
            {
                listViewHeight += RowHeight;
            }
            return listViewHeight;
        }
        return 0;
    }
}

现在,每当您对列表进行更改时,请致电 RaisePropertyChanged("ListViewHeight");。这样,您的 ListView 高度就会被计算出来并更新您的 UI。

【讨论】:

  • 伟大的“肮脏”解决方案。 ListView 与 Xamarin Forms 的许多功能一样,无法完美运行,并且在动态加载元素时无法计算正确的高度。难以置信的!非常感谢!
  • @juangalf 我还没有深入研究它,但也许 Xamarin 的新 CollectionView 解决了这些问题
猜你喜欢
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多