UWP CommandBar有多个溢出菜单,如Word Mobile?

时间:2016-05-27 06:47:07

标签: xaml windows-10 uwp windows-10-universal uwp-xaml

我在桌面上运行了一个基本的C#UWP应用程序。该应用程序的布局类似于Word Mobile,即它有一个主菜单,下面有一个命令栏来应用各种命令。

默认的CommandBar具有主命令(显示为图标)和溢出菜单中显示的辅助命令。

Word Mobile应用程序使用带有" groups"的特殊命令栏。命令按钮。如果窗口大小太小而无法显示所有命令,则每个组都有自己的溢出菜单。(参见下面的屏幕截图)。

有没有办法让这些"分组"使用标准XAML控件使用自己的溢出菜单命令?如果没有,那么实现这样的自定义控件的策略是什么?

示例:

(1)宽窗口:CommandBar显示所有命令按钮:

CommandBar showing all command buttons

(2)小窗口:两个单独的溢出菜单按钮:

enter image description here

2 个答案:

答案 0 :(得分:0)

它可能不是非常复杂,但它仍然可以做很多工作。它可能来自功能区,其中有多个组具有项目折叠和丢弃优先级(我认为),项目按优先级顺序删除。

您需要有一个容器面板,可以读取其中包含的组和MeasureOverride中的优先级 - 当空间压力发生时,它会驱动组中的折叠项目。

我的工具包中的ToolStrip控件具有在工具条和溢出下拉列表之间移动项目的代码(检查示例here),这可能是实现对类似于功能区的折叠的支持的良好的第一步。

IIRC CommandBar的官方示例也实施了逻辑,以便在您可以查看的PrimaryCommandsSecondaryCommands之间移动项目。

答案 1 :(得分:0)

对延迟表示抱歉,但我想我会发布一个概念验证答案。 对于此示例,我在AppBarButton中创建了 7 操作CommandBar,其中包括以下内容

2 独立的按钮 - AllAppsButton CalculatorButton

2 属于CameraGroup的按钮 - CameraButton AttachCameraButton

3 属于FontGroup的按钮 - BoldButton FontButton ItalicButton

我的想法是,如果屏幕尺寸小于 501像素,我会使用VisualStateManagerAdaptiveTriggers来显示Group Chevron Buttons而不是动作按钮。然后通过单击向下V形符号显示操作按钮,这将打开相关的Popup控件。 如果屏幕增加到501像素或更高,则使用AdaptiveTriggers再次隐藏弹出窗口。

MainPage.xaml中

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="CameraGroupStates">
            <VisualState x:Name="Default">
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="501" />
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <Setter Target="CameraButton.Visibility" Value="Visible"/>
                    <Setter Target="AttachCameraButton.Visibility" Value="Visible" />
                    <Setter Target="CameraGroupButton.Visibility" Value="Collapsed" />
                    <Setter Target="CameraGroupPopup.IsOpen" Value="false" />

                    <Setter Target="FontButton.Visibility" Value="Visible"/>
                    <Setter Target="BoldButton.Visibility" Value="Visible" />
                    <Setter Target="ItalicButton.Visibility" Value="Visible" />
                    <Setter Target="FontGroupButton.Visibility" Value="Collapsed" />
                    <Setter Target="FontGroupPopup.IsOpen" Value="false" />
                </VisualState.Setters>
            </VisualState>
            <VisualState x:Name="Minimal">
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="0" />
                </VisualState.StateTriggers>
                <VisualState.Setters>
                    <Setter Target="CameraButton.Visibility" Value="Collapsed"/>
                    <Setter Target="AttachCameraButton.Visibility" Value="Collapsed" />
                    <Setter Target="CameraGroupButton.Visibility" Value="Visible" />

                    <Setter Target="FontButton.Visibility" Value="Collapsed"/>
                    <Setter Target="BoldButton.Visibility" Value="Collapsed" />
                    <Setter Target="ItalicButton.Visibility" Value="Collapsed" />
                    <Setter Target="FontGroupButton.Visibility" Value="Visible" />
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <CommandBar x:Name="MainCommandBar" Height="50">            
        <AppBarButton x:Name="AllAppsButton" Icon="AllApps"></AppBarButton>            
        <AppBarButton x:Name="CameraButton" Icon="Camera"></AppBarButton>
        <AppBarButton x:Name="AttachCameraButton" Icon="AttachCamera"></AppBarButton>

        <!--This is the Group Chevron button for Camera-->
        <AppBarButton x:Name="CameraGroupButton" Visibility="Collapsed" Content="&#xE019;"
                      Click="CameraGroupButton_Click">
            <AppBarButton.ContentTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Content}"
                                   FontFamily="Segoe MDL2 Assets" HorizontalAlignment="Center"></TextBlock>
                    </Grid>
                </DataTemplate>
            </AppBarButton.ContentTemplate>
        </AppBarButton>
        <AppBarButton x:Name="CaluclatorButton" Icon="Calculator"></AppBarButton>
        <AppBarButton x:Name="BoldButton" Icon="Bold"></AppBarButton>
        <AppBarButton x:Name="FontButton" Icon="Font"></AppBarButton>
        <AppBarButton x:Name="ItalicButton" Icon="Italic"></AppBarButton>

        <!--This is the Group Chevron button for Fonts-->
        <AppBarButton x:Name="FontGroupButton" Visibility="Collapsed" Content="&#xE019;"
                      Click="FontGroupButton_Click">
            <AppBarButton.ContentTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Content}"
                                   FontFamily="Segoe MDL2 Assets" HorizontalAlignment="Center"></TextBlock>
                    </Grid>
                </DataTemplate>
            </AppBarButton.ContentTemplate>
        </AppBarButton>
    </CommandBar>
    <Popup x:Name="CameraGroupPopup" HorizontalAlignment="Right" HorizontalOffset="-120"
           VerticalOffset="50" IsOpen="False">
        <StackPanel Orientation="Horizontal" Width="120" Height="60" Background="LightGray"
                    HorizontalAlignment="Center">
            <AppBarButton x:Name="CameraGroupCameraButton" Icon="Camera" Width="50" Height="50"
                          Foreground="Black"/>
            <AppBarButton x:Name="CameraGroupAttachCameraButton" Icon="AttachCamera"
                          Foreground="Black" Width="50" Height="50"></AppBarButton>
        </StackPanel>
    </Popup>
    <Popup x:Name="FontGroupPopup" HorizontalAlignment="Right" HorizontalOffset="-170"
           VerticalOffset="50" IsOpen="False">
        <StackPanel Orientation="Horizontal" Width="170" Height="60" Background="LightGray"
                    HorizontalAlignment="Center">
            <AppBarButton x:Name="FontGroupBoldButton" Icon="Bold" Width="50" Height="50"
                          Foreground="Black"/>
            <AppBarButton x:Name="FontGroupFontButton" Icon="Font"
                          Foreground="Black" Width="50" Height="50"></AppBarButton>
            <AppBarButton x:Name="FontGroupItalicButton" Icon="Italic"
                          Foreground="Black" Width="50" Height="50"></AppBarButton>
        </StackPanel>
    </Popup>
</Grid>

代码隐藏包含2个字段和2个用于隐藏/显示相关弹出窗口的事件,将V形符号更改为向上/向下箭头。

public sealed partial class MainPage : Page
{
    public bool CameraGroupIsOpen { get; set; } = false;
    public bool FontGroupIsOpen { get; set; } = false;

    public MainPage()
    {
        this.InitializeComponent();
    }

    private void CameraGroupButton_Click(object sender, RoutedEventArgs e)
    {
        if (CameraGroupIsOpen)
        {
            CameraGroupPopup.IsOpen = false;
            CameraGroupButton.Content = "\uE019";
            CameraGroupIsOpen = false;
        }
        else
        {
            CameraGroupPopup.IsOpen = true;
            CameraGroupButton.Content = "\uE018";
            CameraGroupIsOpen = true;
        }
    }

    private void FontGroupButton_Click(object sender, RoutedEventArgs e)
    {
        if (FontGroupIsOpen)
        {
            FontGroupPopup.IsOpen = false;
            FontGroupButton.Content = "\uE019";
            FontGroupIsOpen = false;
        }
        else
        {
            FontGroupPopup.IsOpen = true;
            FontGroupButton.Content = "\uE018";
            FontGroupIsOpen = true;
        }
    }
}

相当多的代码无疑可以作为CustomControl进行大幅改进,但想要表达这个想法。希望它有所帮助