Xamarin表单 - 如何在另一个xaml内显示内容

时间:2017-01-27 03:47:27

标签: xaml xamarin.forms

我已经习惯了Android开发,并且在完成我认为简单的任务时遇到了一些困难。

我有一个MasterDetailPage(称为ContainerView.xaml)。

Master是我的导航栏(称为NavbarView.xaml)。

详情应该是一个带有固定标题栏的页面,以及一个" view"我可以根据用户的选择进行交换。

“详细信息”页面名为MainView.xaml。

标题我想在顶部显示,名为TitleBarView.xaml。

然后我有很多内容页面,例如Page1View.xaml。

在我的ContainerView.xaml中:

<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"             
                  xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"       
                  x:Class="MyApp.ContainerView"
                  IsGestureEnabled="True"
                  MasterBehavior="Popover"
                  Title="MasterDetail Page">
  <MasterDetailPage.Master>
  </MasterDetailPage.Master>
  <MasterDetailPage.Detail>
  </MasterDetailPage.Detail>  
</MasterDetailPage>

在我的NavbarView.xaml中 - 这是主

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             x:Class="MyApp.NavBarView"
             Title="Nav Bar">  
  <ContentPage.Content>  
    <StackLayout Orientation="Vertical">
      <Label Text="{Binding Item1}"/>
      <Button Text="Options" Command="{Binding Option1Command}"/>
    </StackLayout >
  </ContentPage.Content>  
</ContentPage>

在我的MainView.xaml中 - 这是详细信息

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyApp.MainView"
             Title="Main View">
  <ContentPage.Content>
  // what to put here to show the TitleBarView.xaml?
  // what to put here to show my content xaml pages?
  </ContentPage.Content>
</ContentPage>

在我的TitleBarView.xaml

<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyApp.TitleBarView">
  <ContentView.Content>    
    <StackLayout Orientation="Horizontal">
      <Label Text="{Binding Item1}"/>
      <Button Text="Options" Command="{Binding OptionsCommand}"/>
    </StackLayout>    
  </ContentView.Content>
</ContentView>

和通用内容视图,当然会有很多其他我想要切换的内容

<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyApp.Page1View">
  <ContentView.Content>
    <StackLayout Orientation="Vertical">
      <Label Text="{Binding Info}"/>
      <Button Text="Log In" Command="{Binding GoToPage2Command}"/>
    </StackLayout >
  </ContentView.Content>
</ContentView>

我正在使用MVVM模型并拥有此代码,但似乎无法使用基础知识。 主页面显示正常。 如果详细信息页面只是一个简单的页面,它可以工作,但我无法弄清楚如何插入TitleBar并换掉&#34;内容&#34;。

ContainerView containerPage = new ContainerView(); 
ContainerViewModel containerVM = new ContainerViewModel();
containerPage.BindingContext = containerVM;

NavBarView navigationBar = new NavBarView();
navigationBar.Title = "Navigation Bar"; // required, otherwise I get an exception.
NavBarViewModel navigationBarVM = new NavBarViewModel();
navigationBar.BindingContext = navigationBarVM;

MainView mainView = new MainView();
mainView.Title = "MainView";
MainViewModel mainViewVM = new MainViewModel();
mainView.BindingContext = mainViewVM;

TitleBarView titleBar = new TitleBarView();
TitleBarViewModel titleBarVM = new TitleBarViewModel();
titleBar.BindingContext = titleBarVM;

Page1View page1 = new Page1View();
Page1ViewModel page1VM = new Page1ViewModel();
page1.BindingContext = page1VM;

mainView.Content = new StackLayout()
{
    Orientation = StackOrientation.Vertical,
    Children = 
    {
        new Label { Text = "I'm Content!" },
        new Label { Text = "I'm Content!" },
        //titleBar.Content,
        //loginView.Content
    }
};

containerPage.MasterBehavior = MasterBehavior.Popover;
containerPage.Master = navigationBar;
containerPage.Detail = new NavigationPage(mainView);

我确定我错过了一个基本概念。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

Xaml可以实例化在代码或Xaml中定义的任何控件,因此在TitleBarView的情况下,您可以在任何Xaml中实例化它

<xmlnsprefix:TitleBarView />

问题是设置正确的xmlnsprefix。每个xaml文件都定义了几个xmlns,您可以添加自己的xml,如下所示:

xmlns:local="clr-namespace:MyApp"

并且它意味着Xml命名空间&#39; local&#39;将引用clr命名空间&#39; MyApp&#39;在当前的集会中。

所以你MainView成为:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
   xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
   xmlns:local="clr-namespace:MyApp"
   x:Class="MyApp.MainView"
   Title="Main View">
  <ContentPage.Content>
   <local:TitleBarView />
  </ContentPage.Content>
</ContentPage>