【问题标题】:UWP CommandBar with multiple overflow menus like Word Mobile?UWP CommandBar 带有多个溢出菜单,如 Word Mobile?
【发布时间】:2016-05-27 06:47:07
【问题描述】:

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

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

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

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

例子:

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

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

【问题讨论】:

  • 看起来您可以使用 AppBarButtonsFlyout 来实现,并使用 VisualStatesAdaptiveTriggers 隐藏和显示某些按钮。稍后我会尝试把一些东西放在一起(如果有人没有打败我的话:)

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


【解决方案1】:

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

2 独立的按钮 - AllAppsButtonCalculatorButton

2 属于 CameraGroup 的按钮 - CameraButtonAttachCameraButton

3 属于 FontGroup 的按钮 - BoldButtonFontButtonItalicButton

这个想法是,如果屏幕尺寸小于 501 像素,我使用 VisualStateManagerAdaptiveTriggers 来显示 Group Chevron 按钮而不是操作按钮。然后通过单击打开相关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 大大改进,但想展示这个想法。希望对你有帮助

【讨论】:

    【解决方案2】:

    这可能不是很复杂,但它可能需要大量的工作。它可能源自功能区,其中有多个具有项目折叠和删除优先级的组(我认为)并且项目按优先级顺序被删除。

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

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

    IIRC CommandBar 的官方示例还实现了在 PrimaryCommandsSecondaryCommands 之间移动项目的逻辑,您可以查看这些逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多