Da jetzt mit Windows 8 die Metro Apps für VB-Entwickler immer wichtiger werden, wollte ich einmal ein paar Metro spezifische Erklärungen geben.
Voraussetzung für dieses Tutorial ist Windows 8 und Visual Studio 2012.
Hintergrundwissen:
- Laut Microsoft müssen Metro Apps "fast and fluid" laufen, somit also größtenteils asynchron entwickelt werden. Denn asynchrone Vorgänge "frieren" die App nicht ein.
- Die Apps müssen im Vollbild und an den Rand angedockt gleichermaßen laufen (wenn das bei der App Sinn macht)
- Die meistgenutzte Bildschirmgröße wird wohl 1366x768 werden, darunter wird es nichts geben.
XAML & Grundlagen:
Grundlegend kann man sich auch kurz bei WPF darüber einlesen, falls man noch gar nichts gemacht hat
WPF XAML Grundlagen, geeignet wenn man noch gar keine Erfahrung mit XAML hat (dafür danke an Andi2572)
Projekt erstellen
Spoiler anzeigen
1). Microsoft Visual Studio 2012 RC runterladen und installieren
2). Neues Projekt
3). Links Visual Basic und Windows Metro Style auswählen
4). Für den Anfang nehmen wir die Vorlage Blank App (XAML)
5). Name eingeben und OK
6). Am Anfang landet ihr wahrscheinlich in der Datei "App.xaml", die schließt ihr einfach und klickt doppelt auf "MainPage.xaml", dann seid ihr im gewohnten Designer. Um ins Codefenster zu gelangen einfach Rechtsklick -> View Code
ViewBox
Spoiler anzeigen
Die ViewBox skaliert ihren Inhalt immer auf ihre eigene Größe.
Also muss aus
das hier werden:
Der Inhalt des Grids wird so auf jeder Bildschirmgröße immer in der Größe 1366x768 auftauchen. Am Grid wurde außerdem noch eine Höhen- und Breitenangabe gemacht.
VisualState(An Seite angedockt)
Spoiler anzeigen
Mithilfe dieser Abfrage kann man für die Logik wichtige Sachen machen, sie fragt einfach den VisualState ab:
Jetzt kommt noch die elegante Lösung mit den VisualstateManager. Diese wird allgemein für das Layout genutzt, ist dafür auch sehr praktisch, da das ganze sehr schnell und schön von statten geht:
1). Diesen XAML Code reinkopieren in den größten Container (meistens das standartmäßig erstellte Grid):
2). In der Codeansicht kommt dieses Event einfach unter "Inherits Page" (bei der Blank Page):
3). Jetzt kann man das Layout bearbeiten für die verschiedenen VisualStates. Da wäre einmal FullScreenLandscape, das bedeutet Breitbild und ist standartmäßig aktiviert, dann gibt es noch "Filled", das bedeutet, dass die eigene App groß ist und eine fremde App angedockt ist. "FullScreenPortrait" bedeutet hochkant, ist bei Tablets meistens auch sehr wichtig. Und bei vielen Apps ist "Snapped" wohl das wichtigste, das bedeutet, dass die App an die Seite angedockt ist.
Jetzt geht man auf das Gerätefenster (Entwurf -> Gerätefenster), wählt in der Box neben "Visual state" den gewünschten Visualstate aus, für den Änderungen gemacht werden sollen und klickt auf "Enable State recording". Dann einfach an den Controls wüst herumreißen und schon hat man die richtigen Änderungen für den richtigen Visualstate.
Seiten wechseln
Spoiler anzeigen
Übersetzungen aus dem Desktop/ bekanntes:
MsgBox:
Spoiler anzeigen
Damit man das ganze überhaupt machen kann, muss die Methode noch als Asynchron erkannt werden, aus
wird
Desktopcode:
Übersetzung:
Sollte man das "Await" am Anfang weglassen, läuft die App während das Dialogfeld angezeigt wird weiter.
Tastaturabfrage:
Spoiler anzeigen
Die Tastaturabfrage per "KeyDown" Event funktioniert bei Metro Apps in der Release Preview bisher nur bei Elementen, denen man den Focus geben kann. Zum Beispiel TextBoxen, Button usw.
1). Das KeyDown Event eines beliebigen Elements nehmen, ein TextBlock "LblAnzeige" wird benötigt
2). Das hier nehme ich mal als Beispiel, was man dann in dem Event machen kann:
Oder auch:
Mausposition im Mousemove Event abfragen
Spoiler anzeigen
1). Projekt erstellen -> Visual Basic -> Windows Metro Style -> Blank App (XAML) -> Name eingeben
2). Doppelklick auf MainPage.xaml
3). Dem Grid einen Namen geben:
4). Ein TextBlock-Element auf die Form ziehen -> Noch einen Namen geben
5). in den Code gehen (Rechtsklick auf "Mainpage.xaml" -> View Code)
6). Das PointerMove Event erzeugen (Erst Oben Links die Box mit den Elementen auswählen und dann auf Mainpage_Events, dann oben rechts auf Pointermoved
7). Jetzt tragen wir diesen Code in die gerade erstellte Methode ein:
Das bringt jetzt den aktuellen Punkt des Mauszeigers im MainGrid auf den TextBlock TxtAnzeige
Hier nochmal alle aktuellen Codes:
Objekte Erstellen
Spoiler anzeigen
Ich erstelle jetzt mal als Beispiel eine Ellipse während der Laufzeit:
XAML: (Ein Button hinzugefügt und dem Grid einen Namen geben)
VB: (auf den Button Doppelklicken und der Code hier versteht sich ja eigentlich von selbst...
Timer
Spoiler anzeigen
Hier werde ich mal kurz darauf eingehen, wie man das gleiche Ergebnis erziehlt, wie bei dem Timer, den man immer auf die Form gezogen hat -> Doppelklick -> im Tick Ereignis war.
1). Projekt erstellen "Beispieltimer" (Blank App)
2). Im Designer ein Textblock (LblAnzeige) und zwei Buttons (BtnStart, BtnStop) hinzufügen, oder diesen xaml Code reinkopieren:
3). Dadurch wurden jetzt auch automatisch zwei Events im Code erstellt, nämlich die beiden Klicks auf die Buttons. Ziel dieses Beispiels wird es sein, einfach eine Zahl bei jedem Tick im Timer +1 zu rechnen. Dafür deklarieren wir jetzt erstmal den Timer, direkt unter "Inherits Page":
und holen uns das Event wie gewohnt oben aus den beiden Comboboxen (Tick). Als Zwischenstufe sollte der Code jetzt so aussehen:
Jetzt schreiben wir einfach in das Klickevent des Buttons "BtnStart" "MainTimer.Start" rein und in das des Buttons "BtnStop" "MainTimer.Stop". In das "Tick" Event nehmen wir einfach immer den Wert des Textblocks "LblAnzeige" +1:
Voraussetzung für dieses Tutorial ist Windows 8 und Visual Studio 2012.
Hintergrundwissen:
- Laut Microsoft müssen Metro Apps "fast and fluid" laufen, somit also größtenteils asynchron entwickelt werden. Denn asynchrone Vorgänge "frieren" die App nicht ein.
- Die Apps müssen im Vollbild und an den Rand angedockt gleichermaßen laufen (wenn das bei der App Sinn macht)
- Die meistgenutzte Bildschirmgröße wird wohl 1366x768 werden, darunter wird es nichts geben.
XAML & Grundlagen:
Grundlegend kann man sich auch kurz bei WPF darüber einlesen, falls man noch gar nichts gemacht hat
WPF XAML Grundlagen, geeignet wenn man noch gar keine Erfahrung mit XAML hat (dafür danke an Andi2572)
Projekt erstellen
1). Microsoft Visual Studio 2012 RC runterladen und installieren
2). Neues Projekt
3). Links Visual Basic und Windows Metro Style auswählen
4). Für den Anfang nehmen wir die Vorlage Blank App (XAML)
5). Name eingeben und OK
6). Am Anfang landet ihr wahrscheinlich in der Datei "App.xaml", die schließt ihr einfach und klickt doppelt auf "MainPage.xaml", dann seid ihr im gewohnten Designer. Um ins Codefenster zu gelangen einfach Rechtsklick -> View Code
ViewBox
Die ViewBox skaliert ihren Inhalt immer auf ihre eigene Größe.
Also muss aus
das hier werden:
Der Inhalt des Grids wird so auf jeder Bildschirmgröße immer in der Größe 1366x768 auftauchen. Am Grid wurde außerdem noch eine Höhen- und Breitenangabe gemacht.
VisualState(An Seite angedockt)
Mithilfe dieser Abfrage kann man für die Logik wichtige Sachen machen, sie fragt einfach den VisualState ab:
Jetzt kommt noch die elegante Lösung mit den VisualstateManager. Diese wird allgemein für das Layout genutzt, ist dafür auch sehr praktisch, da das ganze sehr schnell und schön von statten geht:
1). Diesen XAML Code reinkopieren in den größten Container (meistens das standartmäßig erstellte Grid):
XML-Quellcode
2). In der Codeansicht kommt dieses Event einfach unter "Inherits Page" (bei der Blank Page):
3). Jetzt kann man das Layout bearbeiten für die verschiedenen VisualStates. Da wäre einmal FullScreenLandscape, das bedeutet Breitbild und ist standartmäßig aktiviert, dann gibt es noch "Filled", das bedeutet, dass die eigene App groß ist und eine fremde App angedockt ist. "FullScreenPortrait" bedeutet hochkant, ist bei Tablets meistens auch sehr wichtig. Und bei vielen Apps ist "Snapped" wohl das wichtigste, das bedeutet, dass die App an die Seite angedockt ist.
Jetzt geht man auf das Gerätefenster (Entwurf -> Gerätefenster), wählt in der Box neben "Visual state" den gewünschten Visualstate aus, für den Änderungen gemacht werden sollen und klickt auf "Enable State recording". Dann einfach an den Controls wüst herumreißen und schon hat man die richtigen Änderungen für den richtigen Visualstate.
Seiten wechseln
Dim rootFrame As New Frame
rootFrame.Navigate(GetType(NeueSeite))
Window.Current.Content = rootFrame
Window.Current.Activate()
rootFrame.Navigate(GetType(NeueSeite))
Window.Current.Content = rootFrame
Window.Current.Activate()
Übersetzungen aus dem Desktop/ bekanntes:
MsgBox:
Damit man das ganze überhaupt machen kann, muss die Methode noch als Asynchron erkannt werden, aus
wird
Desktopcode:
Übersetzung:
Sollte man das "Await" am Anfang weglassen, läuft die App während das Dialogfeld angezeigt wird weiter.
Tastaturabfrage:
Die Tastaturabfrage per "KeyDown" Event funktioniert bei Metro Apps in der Release Preview bisher nur bei Elementen, denen man den Focus geben kann. Zum Beispiel TextBoxen, Button usw.
1). Das KeyDown Event eines beliebigen Elements nehmen, ein TextBlock "LblAnzeige" wird benötigt
2). Das hier nehme ich mal als Beispiel, was man dann in dem Event machen kann:
Oder auch:
Mausposition im Mousemove Event abfragen
1). Projekt erstellen -> Visual Basic -> Windows Metro Style -> Blank App (XAML) -> Name eingeben
2). Doppelklick auf MainPage.xaml
3). Dem Grid einen Namen geben:
4). Ein TextBlock-Element auf die Form ziehen -> Noch einen Namen geben
5). in den Code gehen (Rechtsklick auf "Mainpage.xaml" -> View Code)
6). Das PointerMove Event erzeugen (Erst Oben Links die Box mit den Elementen auswählen und dann auf Mainpage_Events, dann oben rechts auf Pointermoved
7). Jetzt tragen wir diesen Code in die gerade erstellte Methode ein:
Das bringt jetzt den aktuellen Punkt des Mauszeigers im MainGrid auf den TextBlock TxtAnzeige
Hier nochmal alle aktuellen Codes:
Quellcode
- <Page
- x:Class="MauspositionImMouseMoveEvent.MainPage"
- IsTabStop="false"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:local="using:MauspositionImMouseMoveEvent"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d">
- <Grid x:Name="MainGrid" Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
- <TextBlock x:Name="TxtAnzeige" HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Height="71" Width="171"/>
- </Grid>
- </Page>
Objekte Erstellen
Ich erstelle jetzt mal als Beispiel eine Ellipse während der Laufzeit:
XAML: (Ein Button hinzugefügt und dem Grid einen Namen geben)
VB: (auf den Button Doppelklicken und der Code hier versteht sich ja eigentlich von selbst...
VB.NET-Quellcode
- Public NotInheritable Class MainPage
- Inherits Page
- Dim GameEllipse As New Windows.UI.Xaml.Shapes.Ellipse
- Private Sub Button_Click_1(sender As Object, e As RoutedEventArgs)
- GameEllipse.Height = 100
- GameEllipse.Width = 100
- GameEllipse.Fill = New SolidColorBrush(Windows.UI.Color.FromArgb(255, 123, 152, 192))
- GameEllipse.Margin = New Thickness(0, 0, 0, 0)
- MainGrid.Children.Add(GameEllipse)
- End Sub
- End Class
Timer
Hier werde ich mal kurz darauf eingehen, wie man das gleiche Ergebnis erziehlt, wie bei dem Timer, den man immer auf die Form gezogen hat -> Doppelklick -> im Tick Ereignis war.
1). Projekt erstellen "Beispieltimer" (Blank App)
2). Im Designer ein Textblock (LblAnzeige) und zwei Buttons (BtnStart, BtnStop) hinzufügen, oder diesen xaml Code reinkopieren:
Quellcode
- <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
- <Button x:Name="BtnStart" Content="Start" HorizontalAlignment="Left" Margin="41,26,0,0" VerticalAlignment="Top" Width="119" Click="BtnStart_Click_1" />
- <Button x:Name="BtnStop" Content="Stop" HorizontalAlignment="Left" Margin="165,26,0,0" VerticalAlignment="Top" Width="123" Click="BtnStop_Click_1"/>
- <TextBlock x:Name="LblAnzeige" FontSize="36" HorizontalAlignment="Left" Margin="41,80,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="247" Height="60"/>
- </Grid>
3). Dadurch wurden jetzt auch automatisch zwei Events im Code erstellt, nämlich die beiden Klicks auf die Buttons. Ziel dieses Beispiels wird es sein, einfach eine Zahl bei jedem Tick im Timer +1 zu rechnen. Dafür deklarieren wir jetzt erstmal den Timer, direkt unter "Inherits Page":
und holen uns das Event wie gewohnt oben aus den beiden Comboboxen (Tick). Als Zwischenstufe sollte der Code jetzt so aussehen:
VB.NET-Quellcode
- Public NotInheritable Class MainPage
- Inherits Page
- Dim WithEvents MainTimer As New DispatcherTimer
- Private Sub BtnStart_Click_1(sender As Object, e As RoutedEventArgs)
- End Sub
- Private Sub BtnStop_Click_1(sender As Object, e As RoutedEventArgs)
- End Sub
- Private Sub MainTimer_Tick(sender As Object, e As Object) Handles MainTimer.Tick
- End Sub
- End Class
Jetzt schreiben wir einfach in das Klickevent des Buttons "BtnStart" "MainTimer.Start" rein und in das des Buttons "BtnStop" "MainTimer.Stop". In das "Tick" Event nehmen wir einfach immer den Wert des Textblocks "LblAnzeige" +1:
VB.NET-Quellcode
- Public NotInheritable Class MainPage
- Inherits Page
- Dim WithEvents MainTimer As New DispatcherTimer
- Private Sub BtnStart_Click_1(sender As Object, e As RoutedEventArgs)
- MainTimer.Start()
- End Sub
- Private Sub BtnStop_Click_1(sender As Object, e As RoutedEventArgs)
- MainTimer.Stop()
- End Sub
- Private Sub MainTimer_Tick(sender As Object, e As Object) Handles MainTimer.Tick
- LblAnzeige.Text = (Convert.ToInt32(LblAnzeige.Text) + 1).ToString
- End Sub
- End Class
Dieser Beitrag wurde bereits 24 mal editiert, zuletzt von „Telcrome“ ()