x:Phase-Attribut
Verwenden Sie x:Phase mit der {x:Bind}-Markuperweiterung, um ListView- und GridView-Elemente inkrementell zu rendern und die Verschiebung zu verbessern. x:Phase bietet eine deklarative Methode zum Erreichen desselben Effekts wie die Verwendung des ContainerContentChanging-Ereignisses zum manuellen Steuern des Renderns von Listenelementen. Siehe auch inkrementelles Aktualisieren von ListView- und GridView-Elementen.
XAML-Attributsyntax
<object x:Phase="PhaseValue".../>
XAML-Werte
Begriff | Beschreibung |
---|---|
PhaseValue | Eine Zahl, die die Phase angibt, in der das Element verarbeitet wird. Der Standardwert ist 0. |
Hinweise
Wenn eine Liste schnell mit Toucheingabe verschoben wird oder das Mausrad verwendet wird, ist die Liste je nach Komplexität der Datenvorlage möglicherweise nicht in der Lage, Elemente schnell genug zu rendern, um mit der Geschwindigkeit des Bildlaufs schrittzuhalten. Dies gilt besonders für ein tragbares Gerät mit einer energieeffizienten CPU wie einem Tablet.
Phasing ermöglicht das inkrementelle Rendern der Datenvorlage, sodass der Inhalt priorisiert und die wichtigsten Elemente zuerst gerendert werden können. Dadurch kann die Liste einige Inhalte für jedes Element anzeigen, wenn die Verschiebung schnell erfolgt, und es werden weitere Elemente jeder Vorlage als Zeitgenehmigung gerendert.
Beispiel
<DataTemplate x:Key="PhasedFileTemplate" x:DataType="model:FileItem">
<Grid Width="200" Height="80">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="75" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Image Grid.RowSpan="4" Source="{x:Bind ImageData}" MaxWidth="70" MaxHeight="70" x:Phase="3"/>
<TextBlock Text="{x:Bind DisplayName}" Grid.Column="1" FontSize="12"/>
<TextBlock Text="{x:Bind prettyDate}" Grid.Column="1" Grid.Row="1" FontSize="12" x:Phase="1"/>
<TextBlock Text="{x:Bind prettyFileSize}" Grid.Column="1" Grid.Row="2" FontSize="12" x:Phase="2"/>
<TextBlock Text="{x:Bind prettyImageSize}" Grid.Column="1" Grid.Row="3" FontSize="12" x:Phase="2"/>
</Grid>
</DataTemplate>
Die Datenvorlage beschreibt vier Phasen:
- Stellt den DisplayName-Textblock dar. Alle Steuerelemente ohne eine angegebene Phase werden implizit als Teil der Phase 0 betrachtet.
- Zeigt den PrettyDate-Textblock an.
- Zeigt die prettyFileSize- und prettyImageSize-Textblöcke.
- Zeigt das Bild an.
Phasing ist ein Feature von {x:Bind} , das mit Steuerelementen funktioniert, die von ListViewBase abgeleitet sind und die die Elementvorlage inkrementell für die Datenbindung verarbeitet. Beim Rendern von Listenelementen rendert ListViewBase eine einzelne Phase für alle Elemente in der Ansicht, bevor Sie mit der nächsten Phase fortfahren. Die Renderingarbeit wird in Zeitschnittbatches ausgeführt, sodass beim Scrollen der Liste die erforderliche Arbeit neu bewertet und nicht für Elemente ausgeführt werden kann, die nicht mehr sichtbar sind.
Das x:Phase-Attribut kann für jedes Element in einer Datenvorlage angegeben werden, das {x:Bind} verwendet. Wenn ein Element eine andere Phase als 0 aufweist, wird das Element aus der Ansicht (über Opacity, nicht Visibility) ausgeblendet, bis diese Phase verarbeitet und Bindungen aktualisiert werden. Wenn ein von ListViewBase abgeleitetes Steuerelement gescrollt wird, werden die Elementvorlagen aus Elementen wiederverwendet, die nicht mehr auf dem Bildschirm angezeigt werden, um die neu sichtbaren Elemente zu rendern. UI-Elemente innerhalb der Vorlage behalten ihre alten Werte bei, bis sie wieder datengebunden sind. Phasing bewirkt, dass der Datenbindungsschritt verzögert wird und daher phasing die UI-Elemente ausblenden muss, falls sie veraltet sind.
Jedes UI-Element darf nur eine Phase angegeben haben. Wenn ja, gilt dies für alle Bindungen für das Element. Wenn keine Phase angegeben ist, wird Phase 0 angenommen.
Phasennummern müssen nicht zusammenhängend sein und sind identisch mit dem Wert von ContainerContentChangingEventArgs.Phase. Das ContainerContentChanging-Ereignis wird für jede Phase ausgelöst, bevor die x:Phase-Bindungen verarbeitet werden.
Phasing wirkt sich nur auf {x:Bind} -Bindungen aus, nicht auf {Binding} -Bindungen.
Phasing wird nur angewendet, wenn die Elementvorlage mithilfe eines Steuerelements gerendert wird, das phasing bekannt ist. Für Windows 10 bedeutet dies ListView und GridView. Phasing gilt nicht für Datenvorlagen, die in anderen Elementsteuerelementen verwendet werden, oder für andere Szenarien wie ContentTemplate oder Hub-Abschnitte – in diesen Fällen werden alle UI-Elemente gleichzeitig datengebunden sein.