2015-04-10 2 views
12

Gibt es eine Möglichkeit, ein "System" -Symbol anzugeben, das bei Verwendung von Xamarin Forms auf einer Registerkarte angezeigt wird? Ich würde gerne Symbole wie Favoriten, Lesezeichen, Verlauf usw. verwenden, aber ich möchte nicht alle meine eigenen Bilder für die verschiedenen Plattformen liefern.Kann man System-Icons auf Tabs in Xamarin Forms verwenden?

Mit Xamarin.iOS man diese Syntax verwenden:

tab1.TabBarItem = new UITabBarItem (UITabBarSystemItem.Favorites, 0); 

Ich kann jedoch nicht gefunden, wie dieses Projekt in dem Cross-Plattform-Xamarin.Forms zu tun.

Dies ist mein aktueller Code:

var profilePage = new ContentPage { 
    Title = "Profile", 
    //This requires my own images to be added to the project whereas 
    //I wish to use built-in images which are platform specific for 
    //Favourites, Bookmark, More, etc... 
    //Icon = "Profile.png", 
    Content = new StackLayout { 
     Spacing = 20, Padding = 50, 
     VerticalOptions = LayoutOptions.Center, 
     Children = { 
     new Entry { Placeholder = "Username" }, 
     new Entry { Placeholder = "Password", IsPassword = true }, 
     new Button { 
      Text = "Login", 
      TextColor = Color.White, 
      BackgroundColor = Color.FromHex("77D065") }}}}; 

var settingsPage = new ContentPage { 
    Title = "Settings", 
    Content = new StackLayout { 
     Spacing = 20, Padding = 50, 
     VerticalOptions = LayoutOptions.Center, 
     Children = { 
      new Entry { Placeholder = "Username" }, 
      new Entry { Placeholder = "Password", IsPassword = true }}} 
     }; 


MainPage = new TabbedPage { Children = {profilePage, settingsPage} }; 
+0

benötigen Sie nur iOS oder Android auch? –

+0

Wenn Sie System-Symbole verwenden, können Sie den Titel nicht ändern. Wenn das ein Problem ist und Sie Ihren eigenen Titel mit Systemikonen verwenden möchten, müssen Sie eine Kopie des Bildes erhalten. Wenn Sie die Systemtitel verwenden können, lassen Sie es uns wissen und ich werde Ihnen eine Antwort geben. Außerdem mischst du 2 Probleme in einem. Möchten Sie plattformübergreifende Symbole verwenden, die in PCL- oder Systemicons gespeichert sind? Wenn Sie über Systemelemente sprechen, können Sie dies an der Stelle des angezeigten Codes nicht angeben, da sie für jede Plattform andere Namen haben. Wenn Sie sie nur an einem Ort aufbewahren möchten, ist dies eine andere Frage. Bitte klären Sie –

+0

Also sagen Sie mit den System-Icons, dass Apple die Titel liefert und ich sie nicht ändern kann?Wenn das nicht möglich ist, denken Sie, dass dies nur mit PNG-Symbolen möglich ist, oder gibt es andere Arten von Symbolen, die Bilder mit sehr guter Qualität liefern und leicht skalieren? Wenn ja, könnten Sie in einer Antwort einige Quellen von Symbolen vorschlagen, die verwendet werden könnten und wie diese in der Größe geändert werden könnten. – Alan2

Antwort

4

Für iOS

Sie benötigen einen benutzerdefinierten Renderer für Ihre Seite. In meinem Beispiel ist dies die CustomTabsPage-Klasse. Sie können nicht einfach System-Icons verwenden, um ein UIImage zu erstellen. Wir müssen UITabBarItem verwenden. Das Problem besteht darin, dass UITabBarItem keine Änderungen an Titel oder Bild/Symbol zulässt. Aber wir können ein Bild davon kopieren.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using UIKit; 
using ButtonRendererDemo; 
using ButtonRendererDemo.iOS; 
using Xamarin.Forms; 
using Xamarin.Forms.Platform.iOS; 

[assembly: ExportRenderer(typeof(CustomTabsPage), typeof(CustomTabsPageRenderer))] 
namespace ButtonRendererDemo.iOS 
{ 
    public class CustomTabsPageRenderer : TabbedRenderer 
    { 

     #region Sytem Image with custom title 

     public override void ViewWillAppear(bool animated) 
     { 
      base.ViewWillAppear(animated); 

      foreach (var item in TabBar.Items) 
      { 
       item.Image = GetTabIcon(item.Title); 
      } 
     } 

     private UIImage GetTabIcon(string title) 
     { 
      UITabBarItem item = null; 

      switch (title) 
      { 
       case "Profile": 
        item = new UITabBarItem(UITabBarSystemItem.Search, 0); 
        break; 
       case "Settings": 
        item = new UITabBarItem(UITabBarSystemItem.Bookmarks, 0); 
        break; 
      } 

      var img = (item != null) ? UIImage.FromImage(item.SelectedImage.CGImage, item.SelectedImage.CurrentScale, item.SelectedImage.Orientation) : new UIImage(); 
      return img; 
     } 

     #endregion 
    } 
} 

enter image description here

Für Android

Dinge sind leichter

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using ButtonRendererDemo; 
using ButtonRendererDemo.Droid; 
using Xamarin.Forms; 
using Xamarin.Forms.Platform.Android; 
using Xamarin.Forms.Platform.Android.AppCompat; 
using Android.Support.Design.Widget; 

[assembly: ExportRenderer(typeof(CustomTabsPage), typeof(CustomTabsPageRenderer))] 
namespace ButtonRendererDemo.Droid 
{ 
    public class CustomTabsPageRenderer : TabbedPageRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e) 
     { 
      base.OnElementChanged(e); 

      //var layout = (TabLayout)ViewGroup.GetChildAt(1); //should be enough but just for robustness we use loop below 

      TabLayout layout = null; 
      for (int i = 0; i < ChildCount; i++) 
      { 
       layout = GetChildAt(i) as TabLayout; 
       if (layout != null) 
        break; 
      } 
      if (layout != null) 
      { 
       for (int tabIndex = 0; tabIndex < layout.TabCount; tabIndex++) 
        SetTabIcon(layout, tabIndex); 
      } 
     } 

     private void SetTabIcon(TabLayout layout, int tabIndex) 
     { 
      var tab = layout.GetTabAt(tabIndex); 

      switch (tabIndex) 
      { 
       case 0: 
        tab.SetIcon(Resource.Drawable.icon2);//from local resource 
        break; 
       case 1: 
        tab.SetIcon(Resource.Drawable.ic_media_play_dark);//from Android system, depends on version ! 
        break; 
      } 
     } 
    } 

} 

enter image description here

+0

Vielen Dank funktioniert gut. Können Sie mir sagen, ob Sie eine Liste aller verfügbaren Symbole gefunden haben? Ich schaute, fand aber keine vollständige Liste. Danke – Alan2

+0

Gehen Sie zu Aufzählung Definition wie UITabBarSystemItem und Sie werden alle von ihnen für die Tableiste sehen. In einer anderen Frage, die ich dir beantwortet habe, hast du 3 weitere Aufzählungen, die du verwenden kannst. Kannst du die Antwort akzeptieren? –

+0

Hallo Yuri, die Antwort wird angenommen, wenn der Bonus ausläuft, da du jetzt die höchste Punktzahl hast :-). Kannst du noch eine Weile warten –

-2

Sie sollten benutzerdefinierten TabbedPage Renderer für iOS-Projekt schreiben:

public class YourTabbedRenderer : TabbedRenderer { 
     public override void ViewWillAppear(bool animated) 
     { 
      base.ViewWillAppear(animated); 
      var items = TabBar.Items; 

      for (var i = 0; i < items.Length; i++) { 
       // set your icons here, you could do some string comparison (check tab title or tab icon resource name) 
       // items[i].Image = 
       // items[i].SelectedImage = 
      } 
     } 
    } 

http://developer.xamarin.com/guides/cross-platform/xamarin-forms/custom-renderer/

0

Um Symbole zu verwenden, benötigen Sie eine plattform- spezifische Struktur. In Xamarin.Forms dafür zu arbeiten:

Icon = "youricon.png"; 

Sie benötigen:

  • iOS: setzen Sie das Bild in /Resources/youricon.png
  • Android: setzen Sie das Bild in/Ressourcen/Drawable/youricon.png
  • Win Phone: Legen Sie das Bild in den Windows Phone-Anwendungsprojektstamm.
+1

Gibt es keine Möglichkeit, Systembilder anzuzeigen, ohne eine Kopie zu enthalten von jedem? Ich denke, der Fragesteller fragt nach Dingen wie dem Kamerasymbol, die sich sogar zwischen verschiedenen Versionen desselben Betriebssystems unterscheiden. –

+0

Während die Symbole plattformspezifisch sind, können Sie je nach Ihren Anforderungen plattformübergreifende Bilder für Ihre Funktionen verwenden: https://developer.xamarin.com/guides/xamarin-forms/working-with/images/ –