2016-04-14 2 views
0

Как и в Windows Forms, мы можем добавить несколько панелей в одну и ту же форму и на основе некоторых условий показать и скрыть конкретную панель. Есть ли какой-либо контроль в Xamarin.Forms, который можно использовать следующим образом?Как реализовать функцию панели в Xamarin.forms

Основная причина этого, у меня есть 3 вкладки на странице. Я использую кнопки для вкладок, а не страниц с вкладками, так как дизайн панели с вкладками не то, что хочет мой клиент. Поэтому у меня есть 3 страницы: Page A, Page B, Page C, и на каждой странице есть 3 вкладки, чтобы перейти на соответствующую страницу. Если пользователь находится на Page A и заполняет какие-то данные (которые еще не сохранены) и хочет перейти на Page B, а затем на Page B, он заполняет несколько подробностей, а затем без сохранения данных на Page B, когда он возвращается к , все подробности заполненный пользователем по Page A и Page B.

Следовательно, если я использую несколько страниц для этого, тогда данные будут потеряны при перенаправлении на новую страницу. Итак, есть ли способ, с помощью которого у меня есть несколько панелей, и скрыть 1-ю панель, когда будет видна 2-я панель, которая не очистит данные и, следовательно, я смогу добиться того, что хочу.

ответ

1

Вы можете просто скрыть панели, которые не используются (с использованием свойства IsVisible) - это вытаскивает их из визуального дерева, но не освобождает их из памяти.

Если вы создаете представление содержимого для каждой страницы, вы можете легко использовать их в своем основном пользовательском интерфейсе, таком как в этом примере. Даже если мы прячемся отдельные панели они будут по-прежнему остаются в памяти, а скрытые:

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

+0

спасибо, что это сработало. – Arti

+0

Не могли бы вы взглянуть на [вопрос] (http://stackoverflow.com/questions/36641270/access-controls-from-view-in-content-page). Я не могу получить доступ к полю ввода contentview в моем contentPage – Arti

+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). Вы не должны перестраивать эту навигацию по страницам с чем-то обычным.

+0

Сохраняя его в кеше, значения по-прежнему сохраняются при смене страницы? – Arti

+0

Да. его статический класс. Его в памяти до тех пор, пока приложение находится в памяти. Вам просто нужно заполнить ваши свойства, когда появится страница. –

+0

Просто для подтверждения. При загрузке страницы скажите «Страница А». Я читаю данные из XML-файла, сериализуя его и отображая в текстовых и других элементах управления, когда пользователь переходит на «страницу B», он будет вызывать onDisappearing и сохранять данные в статическая переменная. Затем, когда я вернусь с «Страница B» на «Страница A», мне снова придется заполнить мои элементы управления сохраненными данными из статических переменных? – Arti

Смежные вопросы