我有一个 Xamarin 表单的内容 View ,其中有 2 个 StackLayout 水平对齐。我想动态更改第二个 Stacklayout 的内容,但在这种情况下我不想使用主详细信息页面。请找到附件以查看我的 UI 的外观。我想在 StackLayout 1 中单击按钮时在 StackLayout 2 中加载不同的页面。
更新:我想使用 MVVM 实现上述目标。
最佳答案
您明确表示要在 Stacklayout2 中加载不同的页面。 开箱即用,这是不可能的。页面不能嵌套在 Xamarin.Forms 中的另一个 View 中*
但是,您很可能也不需要嵌套整个页面,这是个好消息。
您可以将自定义 xaml View 创建为单独的 xaml 文件,然后像常规控件一样引用它们。例如,您将创建一个 xaml 文件 MyDataView,您可以在其中使用一个并用不同的标签、条目和其他内容填充它,然后像添加任何其他控件一样在您的页面中实例化并添加该 MyDataView。
对于您的主机页面,我建议您将 StackLayout2 更改为 ContentView,因为它只会包含一个 View ,如果上面的自定义“MyDataView”之类的东西,它实际上会包含堆栈布局和所有详情。
从页面的角度来看,它的左侧布局包含所有按钮,右侧的“容器”用于承载不同的复杂 View 。所以那里不需要堆栈布局。
您还需要做出一个重要的决定,即何时以及如何实例化您将在右 Pane 中托管的所有 View 。
如果没有太多,您可以选择在加载页面时一次实例化它们。然后在页面使用期间切换到每一个应该非常快。像这样:
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
}
}
或者您可能更喜欢“惰性”实例化 View ,这只会在第一次导航到 View 时实例化 View 。如果某些 View 实际上永远不会被访问,这将很有用,并且您可以通过在需要时才加载 View 来节省一些 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
}
}
最后,您可以在每次需要时实例化 View 。在大多数情况下,我不会选择这条路线。除非你真的特别需要每次都重新创建整个 View (比如你在使用过程中动态更改它,并且在再次显示时需要重置它)
*我在 github 上看到一个自定义渲染器实现将整个页面嵌套在一个 View 中。我没有测试它,因为它当时还没有完全实现。
关于xamarin - 在 Xamarin 表单中的堆栈布局中加载 Xaml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37179935/