2014-05-08 9 views
5

Ich muss den Inhalt einer AppBar ändern, wenn ein Benutzer die Ansicht in einem Hub-Steuerelement ändert.Wie kann ich feststellen, welche HubSection ausgewählt ist?

Die Art, wie ich es bei der Verwendung eines Pivot-Steuerelements gemacht habe, ist das SelectionChanged-Ereignis zu hören und auf den SelectIndex-Wert zu reagieren.

Der Hub verfügt jedoch nur über ein SectionsInViewChanged-Ereignis, das eine Auflistung mehrerer Abschnitte zurückgibt. Normalerweise interagiert der eine Benutzer mit dem benachbarten, kaum sichtbaren Abschnitt.

Also meine Frage ist, wie kann ich sagen, welche Sektion ist die, die derzeit prominent für den Benutzer angezeigt wird (so kann ich die AppBar-Icons entsprechend ändern)?

+1

Können Sie überprüfen, ob der erste derjenige sein würde, der immer funktioniert? Oder vielleicht der mittlere? Oder eines, das mit dem View-Port die größte Fläche hat. –

+0

Es gibt die [SectionsInView'] (http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.hub.sectionsinview.aspx) (kombiniert mit dem 'SectionsInViewChanged') Eigentum/Ereignis. –

+0

Um genau zu sein - Sie können keinen HubSection auswählen. Was Sie wahrscheinlich meinen, ist, welche HubSection am meisten im Blick ist. Aber auch das ist eine komplizierte Frage, die im allgemeinen zu beantworten ist. –

Antwort

13

In der Hub-Steuerung können wir auf das Ereignis SectionsInViewChanged hören. Wir können die HubSection erhalten, die in Bildschirm durch diese angezeigt wird:

var section = hubDemo.SectionsInView[0]; 

hubDemo ist der Name meiner Hub Kontrolle. Und wir können Tag Eigenschaft für jede HubSection festlegen. Zum Beispiel:

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

So können wir AppBar Inhalt von Tag ändern:

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

Nur eine Frage - habe ich die Garantie, dass der erste Abschnitt in SectionsInView der "Haupt" ist? Ein Faktor, der ins Spiel kommen könnte, ist die Textrichtung des Gebiets. Wenn der Text beispielsweise von rechts nach links ist, kann es sinnvoll sein, die Richtung des Hubs umzukehren und eine Vorschau des linken Abschnitts statt des rechten zu erhalten. –

+0

@ Jan Kratochvil, Ja, der erste Abschnitt in SectionsInView ist der wichtigste. –

+1

Denken Sie daran, dass dies keine zuverlässige Technik ist. SectionsInView [0] gibt nicht unbedingt die Haupt-HubSection zurück. Das liegt daran, dass der ScrollViewer des GridViews eine SnapAlignment von Center haben kann, die [0] den vorherigen und [1] den Main HubSection macht. Eine SnapAlignment of Far würde möglicherweise zu demselben falschen Positiv führen. Jede App muss dies selbst entscheiden - weil zum Beispiel 5 HubSections gleichzeitig sichtbar sein könnten - in diesem Szenario, was wäre der "Haupt" HubSection? Es ist eine Sache von Fall zu Fall, aber SectionsInView ist der Ort, um zu beginnen. –