我需要实现的是,在将屏幕从纵向更改为横向时将布局添加到现有页面。我已使用**void OnSizeAllocated(double width,double height)**成功检测到方向更改。但我无法在此事件上添加布局。
我的示例C#代码是
public class MyLayoutView : ContentPage
{
StackLayout portraitcontent = null;
StackLayout landscapecontent = null;
StackLayout footer = null;
public MyLayoutView ()
{
portraitcontent = new StackLayout ();
landscapecontent = new StackLayout ();
footer = new StackLayout ();
this.Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, 0);
this.BackgroundColor = Color.FromHex ("#ffffff");
this.Content = new StackLayout
{
Children =
{
portraitcontent ,
landscapecontent ,
footer
}
};
}
}
按大小分配方法
protected override void OnSizeAllocated(double width, double height)
{
base.OnSizeAllocated(width, height);
if (width < height) {
// In Portrait
portraitcontent .IsVisible = true;
landscapecontent.IsVisible = false;
Debug.WriteLine ("Application Is in portrait");
} else {
// In Landscape
portraitcontent .IsVisible = false;
landscapecontent.IsVisible = true;
landscapecontent.Children.Clear ();
Label LandscapeLabel= new Label
{
Text = "<Each Time Text Changes>",
HorizontalOptions = LayoutOptions.StartAndExpand,
TextColor=Xamarin.Forms.Color.FromHex("#000000")
};
landscapecontent.Children.Add(LandscapeLabel);
Debug.WriteLine ("Application Is in Landscape");
}
}
它抛出不能修改集合,而reenterancy被阻止错误。我需要在stacklayout中添加一个新的标签,每次方向改变。我怎样才能以正确的方式实现它?
先谢了
4条答案
按热度按时间nvbavucw1#
当方向改变时,会多次调用On Size allocated。我认为你必须做更多的验证,比如检查子视图的数量,以避免视图的重复。
只要我尝试过,就没有rotation.itz的事件处理程序,这是一种在方向改变时改变视图的代码。
即使你可以使用公认的答案here。。希望它能达到你的目的。
ht4b089n2#
覆盖OnSizeAllocated可能不是最好的方法。我只是把它放在我的代码中,从纵向到横向调用这个方法大约25次。
我正在尝试的另一件事是在表单页面上挂接一个事件处理程序:
为了跟踪真正的页面旋转并避免处理器不必要的工作,我创建了一个类变量来存储当前状态,然后将其添加到高度/宽度比较中。
这是更快的,但目前似乎有一个内存泄漏与一些布局被切换来回。仍在努力。无法相信,与移动的已经有屏幕旋转多年,一个开发工具将可用,没有一个股票简单的方法来做到这一点。似乎他们可以让我们挂钩几个不同的布局到一个页面,并有运行时自动选择的基础上的环境。我不是一个开发做也许这是一个很难比它似乎应该是我。
如果我得到旋转工作,我会尽量记得回来和邮政编码。
lh80um4z3#
对于Xamarin表单,PCL是检测方向变化的错误层。您需要使用特定于平台的代码来检测它们,然后将其传递到PCL。对于我正在进行的一个项目,这里是我的解决方案:在PCL代码中:
在任何视图(xaml页面),关心我可以观察方向变化做:我使用autofac来初始化ctor中的IOrientation,使用任何最适合您的Ioc或服务解决方案。
对于安卓系统:
在MainActivity.cs中,实现MainActivity.
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity , IErrorReporting,IOrientation
的定向,并在ctor中的某个位置:_lastOrientation = this.Resources.Configuration.Orientation;
在iOS中,扩展Appdelegate
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate ,IOrientation
并在ctor中的某个位置:_lastOrientation = UIDevice.CurrentDevice.Orientation;
我没有可湿性粉剂的实施,但我不能相信这将是很难创建一个....
0md85ypi4#
希望我还不算太晚,使用
Xamarin.Essentials
对我来说是一个更简单的解决方案。Model.cs
View.xaml.cs
View.xaml
不要忘记
INotifyPropertyChanged
的含义。