您明确表示要在 Stacklayout2 中加载不同的页面。
开箱即用,这是不可能的。页面不能嵌套在 Xamarin.Forms 中的另一个视图中*
但是,您很可能也需要嵌套整个页面,这是个好消息。
您可以将自定义 xaml 视图创建为单独的 xaml 文件,然后像常规控件一样引用它们。例如,您将创建一个 xaml 文件 MyDataView,在其中您可以使用 a 并用您的不同标签、条目和其他内容填写它,然后实例化该 MyDataView 并将其添加到您的页面中,就像您使用任何其他控件一样。
对于您的主机页面,我建议您将 StackLayout2 更改为 ContentView,因为它只会包含一个视图,如果您从上面自定义“MyDataView”,实际上将包含堆栈布局和所有详情。
从您的页面的角度来看,它的左侧布局包含所有按钮,右侧有“容器”来承载不同的复杂视图。所以那里不需要stacklayout。
您还需要做出一个重要决定,即何时以及如何实例化您将在右窗格中托管的所有视图。
如果没有太多,您可以选择在加载页面时一次全部实例化它们。然后在页面使用期间切换到每一个应该很快。像这样的:
public partial class MainPage
{
private MyDataView myDataView = new myDataView();
private OtherView otherView = new OtherView();
private ThirdView thirdView = new ThirdView();
public void OnSomeButtonClick(object sender, EventArgs e)
{
Container.View = myDataView; //Container would be the x:Name you gave to your ContentView control on the right side of the page that will host the different views
}
}
或者您可能更喜欢“惰性”实例化视图,这只会在第一次导航到时实例化视图。如果某些视图实际上永远不会被访问,这很有用,并且您可以通过在需要之前不加载视图来节省一些 cpu 周期和内存。当然,缺点是当你第一次加载它时,它会加载得更慢。像这样:
public partial class MainPage
{
private MyDataView myDataView;
private OtherView otherView;
private ThirdView thirdView;
public void OnSomeButtonClick(object sender, EventArgs e)
{
if (myDataView == null) myDataView = new MyDataView();
Container.View = myDataView; //Container would be the x:Name you gave to your ContentView control on the right side of the page that will host the different views
}
}
最后,您可以在每次需要时实例化视图。在大多数情况下,我不会选择这条路线。除非您确实特别需要每次都重新创建整个视图(例如,如果您在使用过程中动态更改它,并且在再次显示时需要重置它)
*我见过一个自定义渲染器实现,它在 github 上的一个视图中嵌套了整个页面。我没有测试它,因为它当时还没有完全实现。