Wir können Tabs mit Shell haben. Was passiert jedoch, wenn wir innerhalb eines bestimmten Abschnitts verschachtelte Registerkarten haben möchten (Beispiel: Raster)?, _was ist, wenn wir jede Registerkarte vollständig anpassen möchten?_. In diesen Fällen bräuchten wir bisher einen benutzerdefinierten Renderer...
Die TabView ist eine Möglichkeit, eine Reihe von Registerkarten und deren jeweiliger Inhalt anzuzeigen. TabView ist nützlich, um mehrere Inhalte anzuzeigen und einem Benutzer die Möglichkeit zu geben, fast alles anzupassen.
HINWEIS : TabView ist eine plattformübergreifende Ansicht , die übernimmt, wenn native Registerkarten an ihre Grenzen stoßen, z.
Als nächstes eine Liste mit den TabView-Eigenschaften, -Ereignissen und -Visualstates.
| Eigentum | Typ | Beschreibung |
|------------|:------------:|:------------:|
| TabItemsSource | IEzählbar | Eine Auflistung, die zum Generieren der Registerkartenelemente der TabView verwendet wird. |
| TabViewItemDataTemplate | Datenvorlage | die Vorlage, die die Registerkartenansicht verwendet, um die Kopfzeilen der Registerkartenelemente zu generieren. |
| TabContentDataTemplate | Datenvorlage | Die Vorlage, die die Registerkartenansicht verwendet, um den Inhalt von Registerkartenelementen zu generieren. |
| Iszyklisch | Bool | Aktivieren oder deaktivieren Sie die zyklische Registerkartennavigation. |
| IsLazy | Bool | Aktivieren oder deaktivieren Sie das Laden von Lazy-Tabs. |
| AusgewählterIndex | Int | Ruft die aktuell ausgewählte Registerkarte ab oder legt diese fest. Standard ist 0. |
| TabStrip-Platzierung | TabStrip-Platzierung | Die TabStrip-Platzierung (oben oder unten). |
| TabStripHintergrund | Pinsel | Der TabStrip-Hintergrund. |
| TabIndikatorBrush | Pinsel | Der TabIndikator-Hintergrund. |
| TabIndikatorHöhe | doppelt | Die TabIndikator-Höhe. |
| TabIndikatorBreite | doppelt | Die TabIndikator-Breite. |
| TabIndikatorPlatzierung | TabIndikatorPlatzierung | |
| TabIndikatorAnsicht | Ansicht | Der TabIndikator-Inhalt. |
| TabInhaltHintergrund | Pinsel | Der Hintergrund des Tab-Inhalts. |
| TabContentHeight | Doppel | Die Höhe des Tab-Inhalts. |
| TabStripHeight | Doppel | Die TabStrip-Höhe. |
| TabContentHeight | Doppel | Die Höhe des Tab-Inhalts. |
| HasTabStripShadow | Bool | Blendet den TabStrip-Schatteneffekt ein oder aus. |
| IsTabTransitionEnabled | Bool | Aktivieren oder deaktivieren Sie den Übergang zwischen Registerkarten. |
| IstSwipeEnabled | Bool | Aktivieren oder deaktivieren Sie die Wischgeste. |
| Eigentum | Typ | Beschreibung |
|------------|:------------:|:------------:|
| Text | Zeichenfolge | Der Text der Registerkarte. |
| Textfarbe | Farbe | Die Textfarbe der Registerkarte. |
| TextColorSelected | Farbe | Die Textfarbe der ausgewählten Registerkarte. |
| Schriftgröße | Schriftgröße | Die im Tab-Text verwendete Schriftgröße. |
| FontSizeSelected | Schriftgröße | Die in der ausgewählten Registerkarte verwendete Schriftgröße. |
| FontFamily | Zeichenfolge | Die in der Registerkarte verwendete Schriftfamilie. |
| FontFamilySelected | Zeichenfolge | Die in der ausgewählten Registerkarte verwendete Schriftfamilie. |
| Schriftattribute | Schriftattribute | Die in der Registerkarte verwendeten Schriftattribute. |
| FontAttributesSelected | Schriftattribute | Die in der ausgewählten Registerkarte verwendeten Schriftattribute. |
| Symbol | Bildquelle | Das Symbol der Registerkarte. |
| IconAusgewählt | Bildquelle | Die als Symbol in der ausgewählten Registerkarte verwendete ImageSource. |
| Inhalt | Ansicht | Der Inhalt der Registerkarte. Ist View, kann alles als Inhalt verwenden. |
| BadgeText | Bool | Der Badge-Text, der in der Registerkarte verwendet wird. |
| BadgeTextColor | Farbe | Die in der Registerkarte verwendete Badge-Textfarbe. |
| BadgeTextColorSelected | Farbe | Die Farbe des Badges, die in der ausgewählten Registerkarte verwendet wird. |
| AbzeichenHintergrundfarbe | Farbe | Die in der Registerkarte verwendete Badge-Farbe. |
| AbzeichenHintergrundFarbeAusgewählt | Farbe | Die Badge-Farbe, die in der ausgewählten Registerkarte verwendet wird. |
| IstAusgewählt | Bool | ein bool, das angibt, ob die Registerkarte ausgewählt ist oder nicht. |
| TapCommand | IBefehl | Befehl, der ausgeführt wird, wenn der Benutzer auf eine Registerkarte tippt. |
| TapCommandParameter | Objekt | Der Tap-Befehlsparameter. |
| Veranstaltung | Beschreibung |
|------------|:-------------:|
| AuswahlGeändert | Ereignis, das ausgelöst wird, wenn die ausgewählte Registerkarte geändert wird. |
| Gescrollt | Ereignis, das ausgelöst wird, wenn zwischen Registerkarten gewischt wird. |
| Veranstaltung | Beschreibung |
|------------|:-------------:|
| TabGetippt | Ereignis, das ausgelöst wird, wenn der Benutzer auf eine Registerkarte tippt. |
Der Visual State Manager (VSM) bietet eine strukturierte Möglichkeit, visuelle Änderungen an der Benutzeroberfläche aus Code vorzunehmen.
Das VSM führt das Konzept der visuellen Zustände ein. TabView kann je nach zugrunde liegendem Zustand mehrere unterschiedliche visuelle Erscheinungsbilder aufweisen.
TabView hat vier spezifische VisualStates :
Sehen wir uns einige Beispiele für gängige Szenarien an.
Sehen wir uns ein grundlegendes Beispiel an:
<TabView
TabStripPlacement="Bottom"
TabStripBackgroundColor="Blue">
<TabViewItem
Icon="triangle.png"
Text="Tab 1">
<Grid
BackgroundColor="Gray">
<Label
HorizontalOptions="Center"
VerticalOptions="Center"
Text="TabContent1" />
</Grid>
</TabViewItem>
<TabViewItem
Icon="circle.png"
Text="Tab 2">
<Grid>
<Label
HorizontalOptions="Center"
VerticalOptions="Center"
Text="TabContent2" />
</Grid>
</TabViewItem>
</TabView>
Verwenden von TabItemsSource (dynamische Registerkarten):
<TabView
TabItemsSource="{Binding Monkeys}"
TabViewItemDataTemplate="{StaticResource TabViewItemTemplate}"
TabContentDataTemplate="{StaticResource TabContentTemplate}" />
Das Aussehen jeder Registerkarte kann angepasst werden:
<ControlTemplate
x:Key="TabItemTemplate">
<Grid>
...
</Grid>
</ControlTemplate>
<TabView>
<TabViewItem
Text="Tab 1"
ControlTemplate="{StaticResource TabItemTemplate}">
</TabViewItem>
</TabView>
Möchten Sie zyklisch zwischen den Registerkarten navigieren?
<TabView
IsCyclical="True">
...
</TabView>
Lazy-Tab-Laden:
<TabView
IsLazy="True">
...
</TabView>
Kann Xamarin.Forms-Animationen verwenden, um den Übergang zwischen den einzelnen Registerkarten anzupassen, die Registerkarte zu animieren, wenn sie angezeigt oder ausgeblendet wird, oder sogar das Abzeichen zu animieren, wenn sie angezeigt oder ausgeblendet wird.
<TabView>
<TabView.TabTransition>
<local:CustomTabTransition />
</TabView.TabTransition>
<TabViewItem
Text="Tab 1">
<TabViewItem.TabAnimation>
<local:CustomTabViewItemAnimation />
</TabViewItem.TabAnimation>
<Grid
BackgroundColor="LawnGreen">
<Label
HorizontalOptions="Center"
VerticalOptions="Center"
Text="TabContent1" />
</Grid>
</TabViewItem>
...
</TabView>
Kann verschiedene visuelle Zustände verwenden, um die aktuelle Registerkarte, die nächste Registerkarte usw. anzupassen.
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="TabViewStates">
<VisualState x:Name="CurrentTab">
<VisualState.Setters>
<Setter Property="Opacity" Value="1" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="PreviousTab">
<VisualState.Setters>
<Setter Property="Opacity" Value="0.7" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="NextTab">
<VisualState.Setters>
<Setter Property="Opacity" Value="0.7" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="DefaultTab">
<VisualState.Setters>
<Setter Property="Opacity" Value="0.9" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Label Text="{Binding Index}" HorizontalOptions="Center" VerticalOptions="End" />
</Grid>
Sie können XAML oder C# verwenden, um die Benutzeroberfläche in Xamarin.Forms zu erstellen. Sehen wir uns an, wie wir mit C# Registerkarten erstellen würden.
var tabView = new Tabs
{
TabStripPlacement = TabStripPlacement.Bottom,
TabStripBackgroundColor = Color.Blue,
TabStripHeight = 60,
TabIndicatorColor = Color.Yellow,
TabContentBackgroundColor = Color.Yellow
};
var tabViewItem1 = new TabViewItem
{
Icon = "triangle.png",
Text = "Tab 1",
TextColor = Color.White,
TextColorSelected = Color.Yellow,
};
var tabViewItem1Content = new Grid
{
BackgroundColor = Color.Gray
};
var label1 = new Label
{
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center,
Text = "TabContent1"
};
tabViewItem1Content.Children.Add(label1);
tabViewItem1.Content = tabViewItem1Content;
tabView.TabItems.Add(tabViewItem1);
var tabViewItem2 = new TabViewItem
{
Icon = "circle.png",
Text = "Tab 2",
TextColor = Color.White,
TextColorSelected = Color.Yellow
};
var tabViewItem2Content = new Grid
{
BackgroundColor = Color.OrangeRed
};
var label2 = new Label
{
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center,
Text = "TabContent2"
};
tabViewItem2Content.Children.Add(label2);
tabViewItem2.Content = tabViewItem2Content;
tabView.TabItems.Add(tabViewItem2);
Kann das Erscheinungsbild des Registerkarteninhalts, der Registerkartenleiste, des Registerkartenelements usw. mithilfe von XAML- Stilen oder CSS anpassen.
Verwenden von XAML:
<Style
x:Key="TabItemStyle"
TargetType="TabViewItem">
<Setter
Property="FontSize"
Value="12" />
<Setter
Property="TextColor"
Value="#979797" />
</Style>
CSS verwenden:
.customTabItem {
font-size: medium;
text-color: red;
}
Basierend auf https://github.com/xamarin/Xamarin.Forms/issues/10773
Können wir das C#-Beispiel in MVU sehen?
Für manche Nutzungsszenarien (zB meins) wäre es sehr hilfreich, wenn das TabView-Verhalten so erweitert würde, dass bei einer ausreichend breiten Darstellung die Tabs sich „entpacken“, also den Inhalt aller Tabs anzeigen würden über den Bildschirm. Dies ermöglicht ein ordentliches 'responsives Design', das mit Tablets sehr gut funktioniert.
Auf einem Telefon oder Tablet im Hochformat sieht der Benutzer eine Ansicht mit Registerkarten, wobei ein Bereich auf dem Bildschirm angezeigt wird und die anderen Bereiche über die Geste "Tab wechseln" erreichbar sind. Wenn das Tablet jedoch in den Querformatmodus gedreht wird (oder auf einem Desktop-Computer mit einem ausreichend breiten Bildschirm), zeigt der Bildschirm alle Fenster gleichzeitig nebeneinander auf dem Bildschirm an.
Bitte das Symbol vom Typ View anstelle von ImageSource sein. Wir möchten Benachrichtigungen anzeigen (normalerweise als kleine Punkte in der oberen Ecke des Tab-Symbols)
Bitte das Symbol vom Typ View anstelle von ImageSource sein. Wir möchten Benachrichtigungen anzeigen (normalerweise als kleine Punkte in der oberen Ecke des Tab-Symbols)
@MhAllan Ich glaube, dies würde mit den TabViewItem-Eigenschaften BadgeText, BadgeTextColor, BadgeTextColorSelected, BadgeBackgroundColor und BadgeBackgroundColorSelected erreicht.
Ich stelle fest, dass BadgeText den falschen Typ aufgelistet zu haben scheint, ich bin mir sicher, dass es String und nicht Bool sein soll.
@irongut , danke für den Hinweis. Ich denke auch, dass das ein falsches Design ist. Es sollte nicht so etwas wie einen BadgeText geben.
Wenn wir an ein Framework denken, das zukünftigen Anforderungen gerecht wird, sollten wir Entwickler nicht auf Typen wie String oder ImageSource beschränken. Wenn dies der Fall ist, werden wir bald Probleme wie diese bekommen: Abzeichen-Ecke abgerundet machen, Abzeichen größer gemacht, kleiner gemacht, Schatten, Links zum Symbol, Oben, Unten, Rechts, vor dem Symbol, hinter dem Symbol, Animiert ... usw. Und die Leute werden frustriert, dass sie es nicht einfach anpassen können. Wenn ich dies schreibe, erstelle ich derzeit ein Benachrichtigungsabzeichen, das sich zweimal um die X-Achse dreht, bevor es sich beruhigt. Sehen Sie, wie seltsam Anpassungen sein können?
SfTabview von @MhAllan Syncfusion ist ein gutes Beispiel dafür, wie es dynamischer gemacht werden kann.
Danke, aber wer möchte schon einen Blick auf die Arbeit eines Blutegels werfen, die für Tausende von Dollar verkauft wird, wenn Betriebssysteme, Programmiersprachen und großartige Frameworks kostenlos sind.
Das meinte ich nicht mit Syncfusion. Es war nur zu sagen, dass es ein gutes Beispiel ist, zu sehen und zu inspirieren, wie sie es gemacht haben. Darüber hinaus bieten sie kostenlos für Privatkunden nur für große Unternehmen mit einem Umsatz von mehr als 1 Mio. Glauben Sie mir, sie sind Xamarin selbst 1-2 Schritte voraus. Wir können hier monatelang, jahrelang nicht einmal eine richtige Collection/ListView bekommen.
Ich stimme zu, dass das TabViewItem als Ganzes mehr oder weniger nur eine ContentView haben sollte, in der wir jede gewünschte Ansicht in die Registerkartenelemente einfügen können. Die derzeitige Vorgehensweise beschränkt uns darauf, Registerkartenansichten so zu implementieren, wie Sie sie sich vorgestellt haben, und nicht so, wie wir sie haben möchten. Wenn Sie eine "einfach zu verwendende" Tab-Ansicht mit einem Standard-Look wünschen, können Sie einfach eine SimpleTabItemView
Klasse erstellen, die die Leute als Ansicht für ihre Tab-Elemente verwenden können, während wir unsere implementieren eigenen Look & Feel über unsere eigenen benutzerdefinierten Ansichten.
Ich stimme zu, dass das TabViewItem als Ganzes mehr oder weniger nur eine ContentView haben sollte, in der wir jede gewünschte Ansicht in die Registerkartenelemente einfügen können. Die derzeitige Vorgehensweise beschränkt uns darauf, Registerkartenansichten so zu implementieren, wie Sie sie sich vorgestellt haben, und nicht so, wie wir sie haben möchten. Wenn Sie eine "einfach zu verwendende" Tab-Ansicht mit einem Standard-Look wünschen, können Sie einfach eine
SimpleTabItemView
Klasse erstellen, die die Leute als Ansicht für ihre Tab-Elemente verwenden können, während wir unsere implementieren eigenen Look & Feel über unsere eigenen benutzerdefinierten Ansichten.
Ich denke, es ist gut, einige Einschränkungen für einen stabilen Betrieb zu haben
Ich denke, es ist gut, einige Einschränkungen für einen stabilen Betrieb zu haben
Sie können weiterhin die standardmäßige Registerkartenansicht für Ihren einfach zu verwendenden "stabilen Betrieb" verwenden. Es gibt keinen Grund, die gesamte Ansicht einzuschränken.
Diese werden vorerst in das Xamarin Community Toolkit verschoben
Hilfreichster Kommentar
@irongut , danke für den Hinweis. Ich denke auch, dass das ein falsches Design ist. Es sollte nicht so etwas wie einen BadgeText geben.
Wenn wir an ein Framework denken, das zukünftigen Anforderungen gerecht wird, sollten wir Entwickler nicht auf Typen wie String oder ImageSource beschränken. Wenn dies der Fall ist, werden wir bald Probleme wie diese bekommen: Abzeichen-Ecke abgerundet machen, Abzeichen größer gemacht, kleiner gemacht, Schatten, Links zum Symbol, Oben, Unten, Rechts, vor dem Symbol, hinter dem Symbol, Animiert ... usw. Und die Leute werden frustriert, dass sie es nicht einfach anpassen können. Wenn ich dies schreibe, erstelle ich derzeit ein Benachrichtigungsabzeichen, das sich zweimal um die X-Achse dreht, bevor es sich beruhigt. Sehen Sie, wie seltsam Anpassungen sein können?