Multiple AppBar / CommandBar’s

De volta ao Windows Phone 8, eu pude usar vários AppBar, trocando-os em certas páginas dinâmicas, mas no Windows Phone 8.1, eu não sei como fazer isso ou isso é possível.

Basicamente para o meu cenário, eu tenho 3 páginas dinâmicas. Cada página precisa ter um CommandBar diferente porque precisa ter controles diferentes.

Alguém pode me mostrar como posso fazer isso?

Edit: Code Que eu usei para o Windows Phone 8 para executar isso:

XAML:

               

C #:

 private void MainPivot_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch (MainPivot.SelectedIndex) { case 0: ApplicationBar = this.Resources["AppBar1"] as ApplicationBar; break; case 1: ApplicationBar = this.Resources["AppBar2"] as ApplicationBar; break; } } 

Basicamente, alterna o AppBar quando a PivotPage é alterada.

No WP8.1 RT, você tem uma propriedade BottomAppBar da sua página . Funciona praticamente da mesma forma (à parte é estendido) que o ApplicationBar antigo – você pode configurá-lo com o CommandBar . Eu criei minhas barras de comando no código e funciona, você pode tentar assim:

 // prepare your CommandBars - run method somewhere in the constructor of the page: CommandBar firstBar; CommandBar secondBar; private void PrepareAppBars() { firstBar = new CommandBar(); firstBar.IsOpen = true; AppBarButton FirstBtn = new AppBarButton() { Icon = new BitmapIcon() { UriSource = new Uri("ms-appx:///Assets/first.png") } }; FirstBtn.Label = "First"; FirstBtn.Click += FirstBtn_Click; FirstBtn.IsEnabled = true; // Similar for second button AppBarButton SecondBtn = new AppBarButton() { Icon = new BitmapIcon() { UriSource = new Uri("ms-appx:///Assets/second.png") } }; firstBar.PrimaryCommands.Add(FirstBtn); firstBar.PrimaryCommands.Add(SecondBtn); // define also SecondaryCommands // simlar secondBar secondBar = new CommandBar(); secondBar.IsOpen = true; // ... } // then you can surely switch them like this: private void MainPivot_SelectionChanged(object sender, SelectionChangedEventArgs e) { switch (MainPivot.SelectedIndex) { case 0: BottomAppBar = firstBar ; break; case 1: BottomAppBar = secondBar ; break; } } 

Uma solução simples é usar o XAML para definir seus botões e ViewModel (padrão MVVM) para controlar as visibilidades desses botões, e isso pode evitar a criação de botões no código e lógica complicada para controlar qual botão exibir.

Primeiro, defina todos os botões que podem ser usados ​​no CommandBar:

     ...   ...     

Em seguida, defina uma propriedade no ViewModel, como:

 public class PageViewModel : INotifyPropertyChanged { ... public int CommandGroup { get { return _commandGroup; } set { _commandGroup = value; NotifyPropertyChanged("CommandGroup"); } } } 

Esta propriedade CommandGroup é usada para controlar a exibição / ocultação de botões, por exemplo, definir CommandGroup = 1 para mostrar botões no grupo1 e ocultar botões em outros grupos e definir CommandGroup = 2 para mostrar botões no grupo2 e ocultar botões em outros grupos, qual group1 e group2 aqui são apenas grupos lógicos.

Em seguida, defina um conversor para converter o valor da propriedade CommandGroup em Visibilidade:

 public class CommandGroupToVisibilityConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { return (System.Convert.ToInt32(value) == System.Convert.ToInt32(parameter)) ? Visibility.Visible : Visibility.Collapsed; } } 

E, finalmente, vincule essa propriedade CommandGroup a todos os botões no CommandBar (copie e cole coisas):

              

Observe que, quando CommandGroup == 2, todos os botões com ConverterParameter = 2 serão exibidos e outros serão eliminados.

Isso pode ser muito útil quando há várias visualizações em uma página (como um Pivot) e cada uma delas tem seu grupo diferente de botões de comando.

Eu terminei com a criação da minha class de página base (na verdade eu já tinha para passar o parâmetro de navegação para ViewModel) que estende a página original. Na página base, adicionei a Propriedade de dependência AppBarCollection para que eu pudesse usá-la em minhas páginas reais no Xaml. E lá eu defino todos os AppBars necessários sem necessidade de criá-los no código por trás. A única coisa que faço lá é escolher qual deles mostrar. Até isso pode ser feito a partir do Xaml, mas eu não queria tornar as coisas mais complexas. A opção é basicamente a primeira sugestão, com a diferença que você pode definir todos os AppBars na sua página no xaml.