Xamarin Forms - 重绘视图
Xamarin Forms - Redraw view
我正在使用 Xamarin Forms 编写应用程序 XAML,我需要一种重绘视图的方法。
我有一个包含多个标签和一个 ListView 的布局。我还有一个按钮,当按下时调用 API 来下载一组需要更新页面上的控件的新数据。
我的所有控件都已正确绑定,因此当数据在后台更新时,数据会在视图上更新,但不会重绘控件,因此会弄乱布局的外观。
有时我的 ListView 中的数据可能只有 1 或 2 行,但通常会更多。第一次绘制页面时,一切看起来都很好,但我的问题是在使用 ListView 中具有不同行数的数据更新视图时,因为控件不会调整大小。
示例:
第一次进入屏幕时,我下载了数据,ListView 有 10 个项目,因此在屏幕上绘制了 10 行
当我按下 "Reload Data" 按钮时,下载的数据现在可能只包含 2 个项目。数据已正确更新,但屏幕上的间距仍然与第一次绘制时的大小相同(有 10 个项目),所以我现在有一个大空白 space。
如果与此示例相反(第一个条目是 2 项,第二个条目是 10 项),则 ListView 的 space 仍然只有 2 项高,因此您只能看到 2共 10 项。
我想要做的是在下载新数据时以某种方式刷新控件,以便重新绘制 ListView 的大小,并且始终是显示的项目数量的正确大小。
有同样的问题。我认为你是错误的。 ListView
并不像您想象的那样工作。它的设计并非总是完全适合其内容。如果你想要那个,你需要自己计算高度并将其设置为ListView
。
一种方法是更改 ListView
的高度。您可以通过将 属性 绑定到 HeightRequest
:
来实现
<ListView
HeightRequest="{Binding ListViewHeight}">
</ListView>
这是我对 ListViewHeight
的计算。 RowHeight
对于 Android 是 72,对于 iOS 是 75。这是一个肮脏的解决方案,因为高度的硬编码值,但它是我找到的解决问题的最佳解决方案。请记住,您需要调整这些值以满足您的需要,否则您的 ListView
可能太 small/tall.
public double ListViewHeight
{
get
{
if (MyItemsList!= null)
{
double listViewHeight = MyItemsList.Count * RowHeight;
if (CanLoadMoreNotifications)
{
listViewHeight += RowHeight;
}
return listViewHeight;
}
return 0;
}
}
现在,每次您对列表进行更改时,请致电 RaisePropertyChanged("ListViewHeight");
。这样,您的 ListView
身高就会计算出来,您的 UI 就会更新。
我正在使用 Xamarin Forms 编写应用程序 XAML,我需要一种重绘视图的方法。
我有一个包含多个标签和一个 ListView 的布局。我还有一个按钮,当按下时调用 API 来下载一组需要更新页面上的控件的新数据。
我的所有控件都已正确绑定,因此当数据在后台更新时,数据会在视图上更新,但不会重绘控件,因此会弄乱布局的外观。
有时我的 ListView 中的数据可能只有 1 或 2 行,但通常会更多。第一次绘制页面时,一切看起来都很好,但我的问题是在使用 ListView 中具有不同行数的数据更新视图时,因为控件不会调整大小。
示例:
第一次进入屏幕时,我下载了数据,ListView 有 10 个项目,因此在屏幕上绘制了 10 行
当我按下 "Reload Data" 按钮时,下载的数据现在可能只包含 2 个项目。数据已正确更新,但屏幕上的间距仍然与第一次绘制时的大小相同(有 10 个项目),所以我现在有一个大空白 space。
如果与此示例相反(第一个条目是 2 项,第二个条目是 10 项),则 ListView 的 space 仍然只有 2 项高,因此您只能看到 2共 10 项。
我想要做的是在下载新数据时以某种方式刷新控件,以便重新绘制 ListView 的大小,并且始终是显示的项目数量的正确大小。
有同样的问题。我认为你是错误的。 ListView
并不像您想象的那样工作。它的设计并非总是完全适合其内容。如果你想要那个,你需要自己计算高度并将其设置为ListView
。
一种方法是更改 ListView
的高度。您可以通过将 属性 绑定到 HeightRequest
:
<ListView
HeightRequest="{Binding ListViewHeight}">
</ListView>
这是我对 ListViewHeight
的计算。 RowHeight
对于 Android 是 72,对于 iOS 是 75。这是一个肮脏的解决方案,因为高度的硬编码值,但它是我找到的解决问题的最佳解决方案。请记住,您需要调整这些值以满足您的需要,否则您的 ListView
可能太 small/tall.
public double ListViewHeight
{
get
{
if (MyItemsList!= null)
{
double listViewHeight = MyItemsList.Count * RowHeight;
if (CanLoadMoreNotifications)
{
listViewHeight += RowHeight;
}
return listViewHeight;
}
return 0;
}
}
现在,每次您对列表进行更改时,请致电 RaisePropertyChanged("ListViewHeight");
。这样,您的 ListView
身高就会计算出来,您的 UI 就会更新。