我在Xamarin表单中有一个内容视图,其中2个StackLayout水平对齐。我想动态更改第二个Stacklayout的内容,但在这种情况下我不想使用主详细信息页面。请查找附件以查看我的UI的外观。我想在StackLayout 1中按钮点击时在StackLayout 2中加载不同的页面。
更新:我想使用MVVM实现上述目标。
答案 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或点击。