2014-05-08 18 views
5

Ho bisogno di cambiare il contenuto di un AppBar quando un utente cambia la vista in un controllo Hub.Come posso sapere quale HubSection è selezionato

Il modo in cui l'ho fatto mentre si utilizzava un controllo Pivot è ascoltare l'evento SelectionChanged e rispondere al valore SelectIndex.

L'hub, tuttavia, ha solo un evento SectionsInViewChanged, che restituisce una raccolta di più sezioni. Di solito l'unico utente sta interagendo con e quindi la sezione adiacente, appena visibile.

Quindi la mia domanda è, come posso sapere quale sezione è quella che viene attualmente visualizzata in modo visibile all'utente (quindi posso modificare le icone AppBar di conseguenza)?

+1

Potete controllare se il primo sarebbe quello che funziona sempre? O forse quello centrale? O uno che ha la più grande area comune con la porta di visualizzazione. –

+0

C'è il ['SectionsInView'] (http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.hub.sectionsinview.aspx) (combinato con' SectionsInViewChanged') proprietà/evento. –

+0

Per motivi di precisione, NON è possibile selezionare un HubSection. Quello che probabilmente intendi è quale HubSection è maggiormente in vista. Ma anche questa è una domanda complicata a cui rispondere in senso generale. –

risposta

13

Nel controllo Hub, siamo in grado di ascoltare l'evento SectionsInViewChanged. Siamo in grado di ottenere il HubSection che viene visualizzato a schermo per questo:

var section = hubDemo.SectionsInView[0]; 

hubDemo è il nome del mio controllo Hub. E possiamo impostare la proprietà Tag per ogni HubSection. Per esempio:

<Hub x:Name="hubDemo" SectionsInViewChanged="demoHub_SectionsInViewChanged"> 
    <HubSection Tag="0" Header="Section1" Width="800"/> 
    <HubSection Tag="1" Header="Section2" Width="400"/> 
    <HubSection Tag="2" Header="Section3" Width="400"/> 
    <HubSection Tag="3" Header="Section4" Width="400"/> 
    <HubSection Tag="4" Header="Section5" Width="600"/> 
</Hub> 

in modo che possiamo modificare il contenuto AppBar per tag:

private void demoHub_SectionsInViewChanged(object sender, SectionsInViewChangedEventArgs e) 
{ 
    var section = hubDemo.SectionsInView[0]; 
    var tag = section.Tag.ToString(); 
    switch (tag) 
    { 
     // Change your AppBar by tag 
    } 
} 
+1

Solo una domanda: ho la garanzia che la prima sezione in SectionsInView sia quella "principale"? Un fattore che potrebbe entrare in gioco è la direzione del testo locale. Ad esempio, se il testo è da destra a sinistra, potrebbe avere senso capovolgere la direzione dell'hub e ottenere un'anteprima della sezione sinistra, anziché quella destra. –

+0

@Jan Kratochvil, Sì, la prima sezione in SectionsInView è la principale. –

+1

Ricorda solo che questa non è una tecnica affidabile. SectionsInView [0] non è garantito per restituire l'HubSection principale. Questo perché ScrollViewer di GridView può avere uno SnapAlignment di Center che rende [0] il precedente e [1] il Main HubSection. Uno SnapAlignment di Far comporterebbe potenzialmente lo stesso falso positivo. Ogni app dovrà decidere da sola - perché, ad esempio, potresti avere 5 HubSection visibili contemporaneamente - in quello scenario quale sarebbe considerato il "principale" HubSection? È un caso per caso, ma SectionsInView è il punto di partenza. –

Problemi correlati