在Xamarin表单中的stacklayout中加载Xaml

时间:2016-05-12 07:21:41

标签: xamarin xamarin.forms xamarin-studio

我在Xamarin表单中有一个内容视图,其中2个StackLayout水平对齐。我想动态更改第二个Stacklayout的内容,但在这种情况下我不想使用主详细信息页面。请查找附件以查看我的UI的外观。我想在StackLayout 1中按钮点击时在StackLayout 2中加载不同的页面。

更新:我想使用MVVM实现上述目标。

enter image description here

2 个答案:

答案 0 :(得分:3)

您明确表示要在Stacklayout2中加载不同的页面。 开箱即用,这是不可能的。页面不能嵌套在Xamarin.Forms *

中的另一个视图中

但是,您很可能不会需要来嵌套整个页面,这是个好消息。

您可以将自定义xaml视图创建为单独的xaml文件,然后像常规控件一样引用它们。例如,您可以创建一个xaml文件MyDataView,在里面你可以使用a并用不同的标签,条目和不符号填充它,然后实例化并在你的页面中添加MyDataView,就像你对任何其他控件一样。

对于您的主机页面,我建议您将StackLayout2更改为ContentView,因为它只包含一个视图,如果类似于上面的自定义“MyDataView”,实际上会包含堆栈布局和所有视图细节。

从页面的角度来看,它的左侧布局包含所有按钮,右侧有“容器”来托管不同的复杂视图。所以它不需要堆栈布局。

还有一个重要的决定,您需要了解何时以及如何实例化您将在右侧窗格中托管的所有视图。

如果没有太多,您可以选择在加载页面时一次性实例化它们。然后在页面使用期间切换到每一个应该非常快。像这样:

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周期和ram,直到需要它为止。当然,缺点是当你第一次加载它时,它会加载得更慢。像这样:

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上的视图中。我没有测试它,因为它当时没有完全实现。

答案 1 :(得分:0)

你不能这样做:

button1.OnClick += (sender, args) =>{
     StackLayout2.Children.Remove(currentview);
     StackLayout2.Children.Add(newview);
}

不确定是否已调用onclick或点击。