2014-05-08 13 views
5

Potrzebuję zmienić zawartość AppBar, gdy użytkownik zmieni widok w kontrolce Hub.Jak określić, która usługa HubSection jest wybrana?

Sposób, w jaki zrobiłem to przy użyciu kontrolki przestawnej, nasłuchuje zdarzenie SelectionChanged i odpowiada na wartość SelectIndex.

Koncentrator ma jednak tylko zdarzenie SectionsInViewChanged, które zwraca kolekcję wielu sekcji. Zwykle jeden użytkownik wchodzi w interakcję, a następnie sąsiednią, ledwo widoczną sekcję.

Moje pytanie brzmi: jak mogę określić, która sekcja jest tą, która jest aktualnie widoczna dla użytkownika (czy mogę odpowiednio zmienić ikony AppBar)?

+1

można sprawdzić, czy pierwsza byłaby taka, która zawsze działa? A może środkowy? Lub taki, który ma największy obszar wspólny z portem widoku. –

+0

Istnieje ['SectionsInView'] (http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.hub.sectionsinview.aspx) (w połączeniu z' SectionsInViewChanged') właściwość/zdarzenie. –

+0

Ze względu na dokładność - NIE MOŻNA wybrać HubSection. Prawdopodobnie chodzi ci o to, który HubSection jest najbardziej widoczny. Ale nawet to jest skomplikowane pytanie, na które należy udzielić odpowiedzi w ogólnym sensie. –

Odpowiedz

13

W sterowaniu Hub, możemy posłuchać zdarzenia SectionsInViewChanged. Możemy uzyskać HubSection który jest wyświetlany na ekranie przez to:

var section = hubDemo.SectionsInView[0]; 

hubDemo jest nazwą moją kontrolą Hub. I możemy ustawić właściwość Tag dla każdego HubSection. Na przykład:

<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> 

Więc możemy zmienić zawartość AppBar etykiet:

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

Tylko jedno pytanie - czy mam gwarancję, że pierwsza sekcja w SectionsInView jest "główna"? Jednym z czynników, które mogą wejść w grę, jest tekstowy kierunek lokalizacji. Na przykład, jeśli tekst jest od prawej do lewej, może być sens odwrócenie kierunku koncentratora i uzyskanie podglądu lewej sekcji zamiast prawej. –

+0

@Jan Kratochvil, tak, pierwsza sekcja w SectionsInView jest najważniejsza. –

+1

Pamiętaj tylko, że nie jest to niezawodna technika. SectionsInView [0] nie gwarantuje powrotu głównego HubSection. To dlatego, że Scroll Viewer GridView może mieć SnapAlignment of Center, który sprawia [0] poprzedni i [1] Main HubSection. SnapAlignment of Far skutkowałby potencjalnie takim samym fałszywie dodatnim wynikiem. Każda aplikacja będzie musiała sama podjąć decyzję - ponieważ, jako przykład, możesz mieć 5 HubSections widocznych jednocześnie - w tym scenariuszu, co byłoby uważane za "główne" HubSection? Jest to sprawa z osobna, ale SectionsInView to miejsce, od którego warto zacząć. –

Powiązane problemy