首页 文章

在Xamarin表单中的stacklayout中加载Xaml

提问于
浏览
3

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

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

enter image description here

2 回答

  • 0

    您明确表示要在Stacklayout2中加载不同的 pages . 开箱即用,这是不可能的 . 页面不能嵌套在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周期和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上的视图中嵌套整个页面 . 我没有测试它,因为它当时没有完全实现 .

  • 3

    不能这样做:

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

    不确定它是否被调用onclick或点击 .

相关问题