【问题标题】:Load a Xaml inside a stacklayout in Xamarin forms在 Xamarin 表单中的 stacklayout 中加载 Xaml
【发布时间】:2016-09-07 21:01:16
【问题描述】:

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

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

【问题讨论】:

    标签: xamarin xamarin.forms xamarin-studio


    【解决方案1】:

    您明确表示要在 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 上的一个视图中嵌套了整个页面。我没有测试它,因为它当时还没有完全实现。

    【讨论】:

    • 感谢@irreal,但如何在 Xaml 文件和我的模型视图中声明此绑定
    • 这不使用绑定来显示适当的视图,它只是将视图分配给后面代码中的容器。在详细信息视图中,您仍然可以正常使用绑定。执行 new MyDataView() 时,只需添加绑定上下文,如 { BindingContext = YourViewModel }。如果您想使用绑定来显示/隐藏这些视图,这是一个完全不同的主题,请创建一个新问题(在搜索现有相同类型的问题之后)并专门询问有关使用绑定来显示控件的信息。
    • 感谢@irreal 将尝试使用绑定上下文来实现
    • 这个答案非常有帮助
    【解决方案2】:

    你不能这样做吗:

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

    不确定它是 onclick 还是 clicked。

    【讨论】:

      猜你喜欢
      • 2016-09-26
      • 1970-01-01
      • 2019-04-02
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多