Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在中设置动画之前获取Xamarin.Forms ContentView的高度_Xamarin_Xamarin.forms - Fatal编程技术网

在中设置动画之前获取Xamarin.Forms ContentView的高度

在中设置动画之前获取Xamarin.Forms ContentView的高度,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我正在尝试创建一个通知,该通知在Xamarin.Forms的页面顶部设置动画。我已经很接近了,但是在我在页面上设置动画之前,我无法获得ContentView的高度。我制作了一个xamarin来演示我的问题,它可以在android模拟器上运行。(经过一些修改后,估计它也可以在ios/wpf上工作) 问题出在ToastNotificationView.AnimateIn()中,我首先将整个contentview的可见性设置为可见(红色背景)。绿色通知将立即在其最终位置渲染,尽管在设置其动画之前,尝

我正在尝试创建一个通知,该通知在Xamarin.Forms的页面顶部设置动画。我已经很接近了,但是在我在页面上设置动画之前,我无法获得ContentView的高度。我制作了一个xamarin来演示我的问题,它可以在android模拟器上运行。(经过一些修改后,估计它也可以在ios/wpf上工作)

问题出在
ToastNotificationView.AnimateIn()
中,我首先将整个contentview的可见性设置为可见(红色背景)。绿色通知将立即在其最终位置渲染,尽管在设置其动画之前,尝试在屏幕外设置其位置的次数不同。这仅在第一次在页面上设置通知动画时发生,因为在将其设置为动画并再次隐藏后,通知的高度才可用

我可以通过硬编码高度偏移来解决这个问题,比如说50,但是要实现可变高度的一致动画,这并不会减少它。我还可以创建一个方法,计算线的数量,然后根据线的数量动态设置高度,但我希望有一种方法可以实际渲染,并以某种方式获得组件的实际高度,而不使其对用户可见,直到我从想要的位置开始动画

public类ToastNotificationView:ContentView{
//要设置动画的通知项输入/输出
私有堆栈布局主堆栈布局;
公共ToastNotificationView(){
InitializeComponent();//让我们假设工作簿支持xaml
//订阅通知事件
NotificationService.NotificationAppeating+=AnimateIn;
//TODO:了解如何在不访问生命周期挂钩的情况下在contentview中取消订阅
}
private async void OnDismissClicked(对象发送方,事件参数e){
等待动画输出();
}
私有异步任务AnimateOut(){
等待MainStackLayout.TranslateTo(0,-MainStackLayout.Height,1000);
IsVisible=false;
}
私有异步void AnimateIn(对象发送方,事件参数e){
//使整个视图可见
IsVisible=true;
//第一次,高度总是零,所以我们不能这样设置
MainStackLayout.TranslationY=-MainStackLayout.Height;
//尝试等待1ms动画获取高度也不会导致正确的高度
等待MainStackLayout.TranslateTo(0,0,1);
等待MainStackLayout.TranslateTo(0,-MainStackLayout.Height,1);
//仍然不会在初始动画中设置动画
等待MainStackLayout.TranslateTo(0,0,1000);
}
}
布局是在InitializeComponent方法中创建的,以支持xamarin工作簿。就这个问题而言,这可能是任何事情

//布局
私有void InitializeComponent(){
//出于调试目的,将contentview背景设置为红色
this.BackgroundColor=Color.Red;
this.VerticalOptions=LayoutOptions.Start;
//实际通知应为绿色
主堆栈布局=新堆栈布局{
方向=堆叠方向。水平,
垂直选项=布局选项。开始,
背景颜色=颜色。绿色
};
var title=新标签{
Text=“你好”
};
var msg=新标签{
Text=“您应该注意的重要内容”
};
var btn=新按钮{
Text=“X”,
垂直选项=布局选项。开始,
HorizontalOptions=LayoutOptions.EndAndExpand,
BorderColor=颜色。透明,
BackgroundColor=颜色。透明,
HeightRequest=40,
宽度请求=40,
保证金=3
};
btn.Clicked+=OnDismissClicked;
var textStack=new StackLayout();
textStack.Children.Add(title);
textStack.Children.Add(msg);
MainStackLayout.Children.Add(textStack);
MainStackLayout.Children.Add(btn);
内容=主框架布局;
//默认可见性是隐藏的
IsVisible=false;
}

您可以使用
测量
获得高度:

private async void AnimateIn(对象发送方,事件参数e)
{
var parent=(VisualElement)parent;
SizeRequest SizeRequest=MainStackLayout.Measure(parent.Width,parent.Height);
MainStackLayout.TranslationY=-sizeRequest.Request.Height;
IsVisible=true;
等待MainStackLayout.TranslateTo(0,0,1000);
}