动态耦合XAML与代码隐藏

时间:2018-06-06 13:40:07

标签: c# xaml xamarin.forms visual-studio-2017

一些背景信息

我正在学习Xamarin.Forms,目前我正在努力将ContentPage的XAML与我的代码隐藏动态耦合。显然,我完全没有意识到应该如何编写Xamarin.Form,所以我完全不知所措。所以我希望你可以因为我的轻微混乱而露出来。

我正在为Android开发移动应用程序,并使用BottomNavigationBarXF将导航栏放在底部,这样做效果很好。目前,我正在使用示例项目进行学习。

实际问题

我创建了一系列ContentPage,我希望在实例化每个新页面时动态耦合。我的ContentPage有相应的代码隐藏,我没有动过;例如,我有一个名为ContentPage的{​​{1}},它有这个代码隐藏:

HomePage

和相应的XAML:

namespace BottomBarXFExample
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class HomePage : ContentPage
    {
        public HomePage()
        {
            InitializeComponent();
        }
    }
 }

我创建页面的方式如下。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="BottomBarXFExample.HomePage">
<ContentPage.Content>
    <StackLayout>
        <Label Text="Welcome to Xamarin.Forms!"
            VerticalOptions="CenterAndExpand" 
            HorizontalOptions="CenterAndExpand" />
    </StackLayout>
</ContentPage.Content>

string[] tabTitles = { "Me", "Trends", "Home", "Plan", "About" }; ContentPage[] pages = new ContentPage[tabTitles.Length]; for (int i = 0; i < tabTitles.Length; ++i) { ContentPage page = createPage(tabTitles[i]); bottomBarPage.Children.Add(page); } 方法:

createPage

private ContentPage createPage(String title) { FileImageSource icon = setIcon(title); ContentPage page = new ContentPage() { Title = title, Icon = icon, }; // should something happen here with the XAML? return page; } 方法:

setIcon

使用这种方法,我成功创建了底部导航栏。但是,使用导航栏导航到每个页面,视图显然是&#34;为空,因为我没有将private FileImageSource setIcon(String title) { FileImageSource icon = (FileImageSource)FileImageSource.FromFile( string.Format( "ic_" + title.ToLowerInvariant() + ".png", title.ToLowerInvariant() )); return icon; } 链接到相应的XAML。这可以在代码中完成吗?

如果我选择实例化每个ContentPage&#34;权利&#34;方式:

ContentPage

然后将它们添加到导航栏中,如下所示:

HomePage homePage = new HomePage()
        {
            Title = "Home",
            Icon = homeIcon
        };

我确实获得了XAML和代码隐藏之间的耦合。但是,我觉得这样做很乏味,也许也没必要。

有什么建议吗?

谢谢,

克里斯

1 个答案:

答案 0 :(得分:0)

Xaml页面和类后面的代码紧密耦合在带有x:Class定义的xaml文件中。 Xaml页面不能继承,但ContentPage类可以,但我没有看到解决您的问题。如果您正在寻找只有一个xaml页面,那么您必须在后面的代码中创建渲染逻辑,例如。

public HomePage(string title)
{
    InitializeComponent();

    switch(title)
    {
       // set Binding Context to your VM
       ... BindingContext = titleBasedVM;
    }
}

然后,您的VM可以包含特定于页面的数据。此概念使用MVVM,强烈建议在使用Xamarin Forms时使用ControlTemplate

另请查看{{3}}以呈现通用页面部分。

您不应该尝试动态生成xaml,因为它不受支持。