多个AppBar / CommandBar

回到Windows Phone 8,我能够使用多个AppBar,在某些数据透视页面上交换它们,但在Windows Phone 8.1中,我不知道如何做到这一点,或者这甚至是可能的。

基本上对于我的场景,我有3个Pivot页面。 每个页面都需要具有不同的CommandBar,因为它需要具有不同的控件。

有人能告诉我如何做到这一点吗?

编辑:代码我用于Windows Phone 8执行此操作:

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

更改数据透视表时,基本上会切换AppBar。

在WP8.1 RT中,您有一个属性BottomAppBar的页面 。 它与旧的ApplicationBar几乎相同(除了扩展) – 您可以使用CommandBar进行设置。 我已经在代码中创建了命令栏并且它可以工作,你可以尝试这样:

 // 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; } } 

一个简单的解决方案是使用XAML定义按钮和ViewModel(MVVM模式)来控制这些按钮的可见性,这可以避免在代码中创建按钮和复杂的逻辑来控制显示哪个按钮。

首先,定义CommandBar中可能使用的所有按钮:

     ...   ...     

然后在ViewModel中定义一个属性,例如:

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

CommandGroup属性用于控制按钮的显示/隐藏,例如,设置CommandGroup = 1以显示group1中的按钮和隐藏其他组中的按钮,设置CommandGroup = 2以显示group2中的按钮和隐藏其他组中的按钮,这里的group1和group2只是逻辑组。

然后定义转换器以将CommandGroup属性的值转换为Visibility:

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

最后,将此CommandGroup属性绑定到CommandBar中的所有按钮(复制和粘贴内容):

              

请注意,当CommandGroup == 2时,将显示所有具有ConverterParameter = 2的按钮,其他按钮将消失。

在一个页面中有多个视图(如Pivot)并且每个视图都有不同的命令按钮组时,这可能非常有用。

我最后创建了我的基页类(实际上我已经将导航参数传递给ViewModel),它扩展了原始页面。 在基页中我添加了依赖属性AppBarCollection,以便我可以在Xaml的真实页面中使用它。 在那里,我定义了所有必要的AppBars,而无需在后面的代码中创建它们。 我在那里做的唯一一件事是选择展示哪一个。 即使这可以从Xaml完成,但我不想让事情变得更复杂。 该选项基本上是第一个建议,区别在于您可以在xaml中定义您页面中的所有AppBars。