Xamarin:如何避免内部ListView在iOS上显示键盘时更改其内容大小

Xamarin:如何避免内部ListView在iOS上显示键盘时更改其内容大小,ios,listview,xamarin,xamarin.forms,Ios,Listview,Xamarin,Xamarin.forms,我正在创建此内容页: Content=newstacklayout() { 间距=0, 方向=堆叠方向。垂直, 儿童={ (listView=新建listView { HasRows=true, SeparatorVisibility=SeparatorVisibility.None, IsPullToRefreshEnabled=true, HorizontalOptions=LayoutOptions.FillAndExpand, VerticalOptions=LayoutOptions.

我正在创建此内容页:

Content=newstacklayout()
{
间距=0,
方向=堆叠方向。垂直,
儿童={
(listView=新建listView
{
HasRows=true,
SeparatorVisibility=SeparatorVisibility.None,
IsPullToRefreshEnabled=true,
HorizontalOptions=LayoutOptions.FillAndExpand,
VerticalOptions=LayoutOptions.FillAndExpand,
ItemsSource=listItems,
ItemTemplate=新的MyDataTemplateSelector(用户名),
BackgroundColor=Constants.Cor_ChatFundo
}),
(网格=新网格)
{
行间距=1,
列间距=2,
衬垫=新厚度(5),
背景颜色=颜色。白色,
垂直选项=布局选项。结束,
HorizontalOptions=LayoutOptions.FillAndExpand,
列定义=
{
new ColumnDefinition{Width=new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width=new GridLength(1,GridUnitType.Auto)}
},
行定义=
{
新行定义{Height=new GridLength(40)}
}
})
}
};
grid.Children.Add(sendMessageEntry=新条目
{
FontSize=18,
HeightRequest=30,
占位符=“在此处键入…”,
键盘=键盘。聊天
}, 0, 0);
grid.Children.Add(buttonSend=new按钮
{
Text=“发送”
}, 1, 0);
我正在使用键盘重叠渲染器的修改版本,以便在显示键盘时向上移动整个页面

键盘重叠渲染器的修改版本是处理iOS8键盘上方的建议栏。。。原始版本不能处理这个问题

KeyboardOverlapper类:

使用系统;
使用Xamarin.Forms.Platform.iOS;
使用基础;
使用UIKit;
使用Xamarin.Forms;
使用核心图形;
使用EficienciaEnergetica.iOS.键盘重叠;
使用系统诊断;
使用eficiencaergetica.ContentPages;
[assembly:ExportRenderer(typeof(页面)、typeof(键盘重叠渲染器))]
命名空间efficienciaenergetica.iOS.KeyboardOverlap
{
[保留(所有成员=真)]
公共类键盘重叠呈现器:页面呈现器
{
矩形初始视图状态;
NSObject(键盘显示观察器);
NSObject_键盘HideObserver;
私人bool\u页面被上移;
私人双_activeViewBottom;
显示的是私人键盘;
公共静态void StaticInit()
{
var now=DateTime.now;
WriteLine(“键盘重叠插件已初始化{0}”,现在);
}
公共覆盖无效视图将出现(布尔动画)
{
基本视图将显示(动画);
var page=作为ContentPage的元素;
如果(第页!=null)
{
var contentScrollView=page.Content作为ScrollView;
if(contentScrollView!=null)
返回;
initialViewState=Element.Bounds;
RegisterWorkeryBoardNotifications();
}
}
公共覆盖无效视图将消失(布尔动画)
{
基本视图将消失(动画);
取消注册ForkeyBoardNotifications();
}
无效注册表WorkeryBoardNotifications()
{
如果(_keyboardShowObserver==null)
_keyboardShowObserver=NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillShowNotification,OnKeyboardShow);
如果(_keyboardHideObserver==null)
_keyboardHideObserver=NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.WillHideNotification,OnKeyboardHide);
}
作废取消注册ForkeyBoardNotifications()
{
_IsKeyboardShowed=假;
如果(_keyboardShowObserver!=null)
{
NSNotificationCenter.DefaultCenter.RemoveObserver(_keyboardShowObserver);
_keyboardShowObserver.Dispose();
_keyboardShowObserver=null;
}
如果(_keyboardHideObserver!=null)
{
NSNotificationCenter.DefaultCenter.RemoveObserver(_keyboardHideObserver);
_keyboardHideObserver.Dispose();
_keyboardHideObserver=null;
}
}
受保护的虚拟void OnKeyboardShow(NSNotification通知)
{
如果(!IsViewLoaded)
返回;
_IsKeyboardShowed=true;
var activeView=View.FindFirstResponder();
if(activeView==null)
返回;
var keyboardFrame=UIKeyboard.FrameEndFromNotification(通知);
var isOverlapping=activeView.IsKeyboardOverlapping(视图,键盘框);
如果(!isOverlapping)
返回;
if(等重叠)
{
系统。诊断。调试。写入线(键盘框);
_activeViewBottom=activeView.GetViewRelativeBottom(视图);
ShiftPageUp(keyboardFrame.Height,_activeViewBottom);
}
}
私有void OnKeyboardHide(NSNotification通知)
{
如果(!IsViewLoaded)
返回;
_IsKeyboardShowed=假;
var keyboardFrame=UIKeyboard.FrameEndFromNotification(通知);
如果(_pagewasthiftedup)
ShiftPageDown(keyboardFrame.Height,_activeViewBottom);
}
专用void ShiftPageUp(nfloat键盘高度,双活动视图底部)
{
var pageFrame=initialViewState;//Element.Bounds;
var newY=pageFrame.Y+CalculateShiftByAmount(pageFrame.Height、keyboardHeight、activeViewBottom);
元素,洛杉矶