2016-04-14 23 views
0

Windows Forms'da olduğu gibi, aynı formda birden fazla panel ekleyebilir ve bazı durum gösterimlerine ve belirli panelleri gizleyebiliriz. Xamarin.Forms'da bu şekilde kullanılabilecek herhangi bir kontrol var mı?Xamarin.forms uygulamasındaki panel özelliği nasıl yapılır

Bunun arkasındaki temel neden, bir sayfada 3 sekme var. Sekmeli çubuklar için değil, sekmeli sayfalar istemiyorum, sekmeli çubuk tasarımı istemcimin istediği gibi değil. Bu yüzden 3 sayfamın Page A, Page B, Page C olduğunu ve her sayfanın ilgili sayfaya gitmek için 3 sekmesi olduğunu söylüyor. Kullanıcı Page A üzerindeyse ve Page B'a ve daha sonra Page B'a gitmek istediği bir veriyi doldurup daha sonra Page B'a gitmek istiyorsa, Page A'a geri döndüğünde Page B numaralı veriyi kaydetmeden Page A ve Page B numaralı kullanıcı tarafından doldurulmuş olmalıdır.

Dolayısıyla, bunun için birden çok sayfa kullanırsam, yeni sayfaya yönlendirdiğimde veriler kaybolacaktır. Yani herhangi bir veriyi temizlemeyecek ve böylece istediğimi elde edebileceğim 2. panel görünür olduğunda birden fazla panele sahip olduğum ve 1. paneli gizleyebileceğim herhangi bir yol var mı?

cevap

1

Kullanılmayan panelleri (IsVisible özelliğini kullanarak) gizleyebilirsiniz - bu onları görsel ağacın dışına çeker, ancak bunları bellekten çıkarmaz.

Her sayfa için bir İçerik Görünümü oluşturursanız, bu örnekte olduğu gibi ana kullanıcı arayüzünüzde bunları kolayca kullanabilirsiniz. bireysel panelleri gizleme olsa bile gizli iken hala bellekte kalır:

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 (ana UI sayfa:

MyView.cs (bu panellerde istediğiniz her şey olabilir)):

<?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

teşekkür ederim işe yaradı. – Arti

+0

Lütfen [soru] bölümüne bir göz atın (http://stackoverflow.com/questions/36641270/access-controls-from-view-in-content-page). ContentPage – Arti

+0

'daki contentview giriş alanına erişemiyorum, bu soruya da bir göz attım ve yardımcı olması gereken bir cevap ekledim. Sizin için işe yararsa lütfen cevap olarak işaretleyin, böylece başkaları artık takılmadığınız bir sorunu çözmeye çalışmak için zaman harcamayacaktır :). –

1

Bu verileri önbelleğe kaydedip buradan yükleyebilirsiniz.

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; 
} 

Ancak dikkat: Yalnızca bir bellek önbelleği. Uygulamaya tombston uygulanmışsa, veriler kaybolacaktır. Bu yaklaşımı önce deneyebilir ve ihtiyacınıza uygun olup olmadığını görebilirsiniz. Bundan sonra, verileri geçici bir depoda (ör. Akavache ile) saklamanız gerekir. Bu sayfa gezinme davranışını özel bir şeyle yeniden oluşturmamalısınız.

+0

Önbelleğe kaydederek, değerler sayfa değiştiğinde devam eder mi? – Arti

+0

Evet. onun statik bir sınıf. App hafızada olduğu sürece hafızada. Sayfa görüntülendiğinde mülklerinizi doldurmanız yeterlidir. –

+0

Sadece onaylamak için, sayfanın yüklendiği sayfada 'Sayfa A' xml dosyasındaki veriyi okuyup serileştirip metin kutularında ve diğer denetimlerde görüntüledikten sonra, kullanıcı B'ye gittiğinde Sayfa B'yi arayacaktır. statik değişken. Daha sonra 'Sayfa B'den' Sayfa A'ya geri döndüğümde, tekrar kontrollerimi statik değişkenlerden kaydedilmiş verilerle doldurmam gerekecek mi? – Arti

İlgili konular