【发布时间】:2017-12-14 17:48:49
【问题描述】:
我们有一个即时消息应用程序。我们希望在收到消息时自动滚动,以便看到新消息。目前,当接收到需要滚动的第一条消息时,页面不会滚动。也就是说,新消息隐藏在我们的输入控件后面。它需要另一条消息或用户调整滚动视图,然后才能正常工作。
我们的 xaml 是这样的:
<ContentPage>
<StackLayout x:Name="mainStackLayout">
<customControls:NavBar />
<ScrollView x:Name="mainScrollView">
<StackLayout x:Name="mainScrollViewStackLayout">
<ScrollView x:Name="messagesScrollView">
<StackLayout x:Name="messagesScrollViewContentStackLayout">
<!-- Messages are programmatically inserted here -->
</StackLayout>
</ScrollView>
</StackLayout>
</ScrollView>
<StackLayout>
<!-- a couple buttons/inputs for sending messages -->
</StackLayout>
</StackLayout>
</ContentPage>
我们调用滚动的代码如下所示:
public void ScrollMessagesToEnd()
{
StackLayout messagesContent = (messagesScrollView.Content as StackLayout);
var frame = messagesContent.Children.LastOrDefault();
if (frame != null)
{
messagesScrollView.ScrollToAsync(frame, ScrollToPosition.MakeVisible, true);
}
}
【问题讨论】:
-
你的消息去哪儿了?某处有listView吗?
-
@YuriS 他们将以编程方式进入 StackLayout 消息ScrollViewContentStackLayout。我会添加评论以便清楚。
-
作为什么插入?每条消息都是单独的布局?为什么不使用 ListView?如果你确实使用它,那么你就不需要 ScrollView。顺便说一句,Xamarin 强烈建议不要在滚动视图中使用 ListView,并且您正在主滚动视图中执行消息滚动视图。这是一种糟糕的设计。你能以某种方式简化它吗?我会做一个包含 3 个项目的堆栈布局:导航栏、列表视图和发送堆栈布局。列表视图将是唯一可滚动的。让我知道你的想法。我已经为您提供了一个解决方案,但我想把它改正:-)
-
每条插入的消息都是一个扩展 Frame 的自定义视图。我不是这个页面的主要开发者,所以我不能说为什么我们不使用列表视图(如果我理解正确的话)列表视图中的自定义视图很痛苦。同样,如果我记得原始开发人员所说的正确,我们需要双滚动视图,因为 iOS 没有正确调整键盘,但 mainScrollView 允许页面移动并为其腾出空间。
-
你能提供代码(这样我就不用写了)用测试数据填充消息吗?不确定我们是否可以使其与嵌套的 ScrollViews 一起使用。我宁愿找到iOS键盘的解决方案
标签: c# xamarin xamarin.forms