如何在Xamarin.forms

时间:2016-04-14 06:49:38

标签: c# xamarin navigation xamarin.forms

与Windows窗体一样,我们可以在同一个窗体中添加多个面板,并根据某些条件显示和隐藏特定面板。 Xamarin.Forms中是否有可以像这样使用的控件?

这背后的主要原因是,我在页面上有3个标签。我使用标签按钮而不是标签页,因为标签栏的设计不是我的客户想要的。所以我有3页说Page APage BPage C,每个页面都有3个标签可以转到相应的页面。如果用户在Page A上并填写某种数据(尚未保存),并希望转到Page B然后再转到Page B,则会填写更多详细信息然后不保存Page B上的数据回到Page A时,用户在Page APage B上填写的所有详细信息都必须可用。

因此,如果我为此使用多个页面,那么当我重定向到新页面时数据将会丢失。那么有什么方法可以让我有多个面板并隐藏第一个面板,当第二个面板可见时,它不会清除任何数据,因此我可以达到我想要的效果。

2 个答案:

答案 0 :(得分:1)

您可以将此数据保存到缓存中并从那里加载。

public static class MyDataCache 
{
    public static MyData MyData { get; } = new MyData();
}

// in your pages
protected override void OnAppearing()
{            
    base.OnAppearing();
    // set data from MyDataCache.MyData
    MyProperty = MyDataCache.MyData.MyProperty;
}

protected override void OnDisappearing()
{            
    base.OnDisappearing();
    // set data to MyDataCache.MyData
    MyDataCache.MyData.MyProperty = MyProperty;
}

但要注意:它只是一个内存缓存。如果应用程序被逻辑删除,数据将丢失。您可以先尝试这种方法,看看它是否符合您的需求。之后,您应该将数据存储在临时存储中(例如,使用Akavache)。您不应该使用自定义内容重建此页面导航行为。

答案 1 :(得分:1)

您可以隐藏未使用的面板(使用IsVisible属性) - 这会将它们从可视树中拉出,但不会从内存中释放它们。

如果您为每个页面创建内容视图,则可以在主UI中轻松使用它们,例如本示例中。即使我们隐藏了各个面板,它们仍会隐藏在内存中:

MyView.cs(这可能是您在面板中想要的任何内容):

using System;
using Xamarin.Forms;

namespace FormsSandbox
{
    public class MyView : ContentView
    {
        public static BindableProperty TextProperty = BindableProperty.Create("Text", typeof(string), typeof(MyView), 
            String.Empty, BindingMode.Default, null, TextChanged);

        public string Text {
            get {
                return (string)GetValue (TextProperty);
            }
            set {
                SetValue (TextProperty, value);
            }
        }

        private Label _contentLabel;

        public MyView ()
        {
            _contentLabel = new Label {
                FontSize = 56,
                FontAttributes = FontAttributes.Bold,
                HorizontalTextAlignment = TextAlignment.Center,
                VerticalTextAlignment = TextAlignment.Center
            };
            Content = _contentLabel;
        }

        static void TextChanged (BindableObject bindable, object oldValue, object newValue)
        {
            var view = (MyView)bindable;
            view._contentLabel.Text = (newValue ?? "").ToString ();
        }
    }
}

XamlPage.xaml(主UI页面):

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:sandbox="clr-namespace:FormsSandbox"
    x:Class="FormsSandbox.XamlPage">
    <ContentPage.Padding>
        <OnPlatform x:TypeArguments="Thickness" iOS="0,20,0,0" Android="0" WinPhone="0"/>
    </ContentPage.Padding>

    <Grid RowSpacing="0" ColumnSpacing="0">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Button Text="1" Clicked="ButtonClicked" x:Name="Button1" Grid.Column="0" />
        <Button Text="2" Clicked="ButtonClicked" x:Name="Button2" Grid.Column="1" />
        <Button Text="3" Clicked="ButtonClicked" x:Name="Button3" Grid.Column="2" />

        <sandbox:MyView Text="1" x:Name="View1" Grid.Row="1" Grid.ColumnSpan="3" />
        <sandbox:MyView Text="2" x:Name="View2" Grid.Row="1" Grid.ColumnSpan="3" />
        <sandbox:MyView Text="3" x:Name="View3" Grid.Row="1" Grid.ColumnSpan="3" />
    </Grid>

</ContentPage>

XamlPage.xaml.cs:

using System;
using Xamarin.Forms;

namespace FormsSandbox
{
    public partial class XamlPage : ContentPage
    {
        public XamlPage ()
        {
            InitializeComponent ();
            SelectButton (Button1);
        }

        void SelectButton(Button button)
        {
            View view = null;
            if (button == Button1)
                view = View1;
            if (button == Button2)
                view = View2;
            if (button == Button3)
                view = View3;
            View1.IsVisible = View1 == view;
            View2.IsVisible = View2 == view;
            View3.IsVisible = View3 == view;
            Button1.TextColor = (Button1 == button) ? Color.Accent.AddLuminosity(0.18) : (Color)Button.TextColorProperty.DefaultValue;
            Button2.TextColor = (Button2 == button) ? Color.Accent.AddLuminosity(0.18) : (Color)Button.TextColorProperty.DefaultValue;
            Button3.TextColor = (Button3 == button) ? Color.Accent.AddLuminosity(0.18) : (Color)Button.TextColorProperty.DefaultValue;
            Button1.BackgroundColor = (Button1 == button) ? Color.Silver.AddLuminosity(0.18) : Color.Silver.AddLuminosity(0.1);
            Button2.BackgroundColor = (Button2 == button) ? Color.Silver.AddLuminosity(0.18) : Color.Silver.AddLuminosity(0.1);
            Button3.BackgroundColor = (Button3 == button) ? Color.Silver.AddLuminosity(0.18) : Color.Silver.AddLuminosity(0.1);
        }

        void ButtonClicked (object sender, EventArgs e)
        {
            SelectButton ((Button)sender);
        }
    }
}

Running example