UWP 命令栏更多按钮未显示 DynamicOverflowEnabled

UWP commandbar more button not showing up with DynamicOverflowEnabled

我有一个 UWP 应用程序,我在其中使用 CustomMediaTransportControls。 在这些控件中,我在命令栏 PrimaryCommands 中添加了一些额外的按钮,并根据文档设置了 IsDynamicOverflowEnabled=true 它应该在屏幕显示时自动将主要命令发送到溢出菜单尺寸不足以容纳所有按钮。它应该根据每个 appbarButton 上的 MediaTransportControlsHelper.DropoutOrder 属性 将它们删除。

问题

当屏幕尺寸较小时,控件似乎会按预期进入溢出菜单,但我无法访问或看到它们,因为 更多 按钮永远不可见,这很奇怪,因为我尝试设置 OverflowButtonVisibility=visible,甚至尝试使用 Auto,但该按钮从未出现在 UI 上。我知道主要命令会溢出的事实是因为我明确地将更多按钮设置为可见,从命令栏的 模板样式 中,然后我在 UI,但它并不理想,因为即使在溢出中没有任何内容时它也会显示。所以我把它改回原来的默认绑定值。

此外,我正在使用重新模板化的命令栏样式,因为我想将主要命令按钮的 horizo​​ntalAlignment 设置为中心。

在第一张图片中,您可以看到所有控件都已显示

但是在这里,当我将 window 调整为更小的尺寸时,我看到的控件更少,但没有溢出菜单(更多)按钮。

另请注意,应用程序项目将创作者更新作为最低目标,因此 DynamicOverflow 应该可以工作,因为它是在周年更新中引入的。

更新 1

在下图中,您可以看到我在页面中添加了一个普通的命令栏,即使没有溢出按钮,它也会显示更多按钮。显然它是为我猜的标签显示的。

and here you can see that upon resizing, the more button does get the extra buttons in it.

所以问题是,为什么它不能与 MediaTransportControls 命令栏一起使用?我什至尝试了没有任何自定义样式的默认 transportcontrols,只是使用 is..buttonvisible 启用了它上面的所有按钮,我在那里也遇到了同样的错误。这个功能在哪个阶段被阻止了?以及如何覆盖该行为?

使用 Live 属性 资源管理器,我可以确认更多按钮的可见性已设置为折叠,如果我在 属性 资源管理器中将其设置为可见,我可以看到该按钮,现在呢我不明白为什么它会崩溃?即使我在 xaml 样式中将 overflowbuttonvisibility 设置为可见?

在大量使用我的自定义控件之后,我不得不动态覆盖行为并创建一些我自己的行为,以便完成这项工作。

我在控件的 Loaded 事件中得到了以下 2 个控件

private void FluentMtc_Loaded(object sender, RoutedEventArgs e)
{
    //secondaryItemControl to check how many items are in overflow menu
    _secondarycontrols = (CommandBarOverflowPresenter)(((Popup)this.FindDescendantByName("OverflowPopup")).Child).FindDescendantByName("SecondaryItemsControl");
    //to toggle visibility of more button
    _moreButton = (Button)this.FindDescendantByName("MoreButton");
}

并且我在自定义媒体传输控件的 OnApplyTemplate() 方法中订阅了 CommandBar 的 DynamicOverflowItemsChanging 事件。

    protected override void OnApplyTemplate()
    {

        var barr = (CommandBar)GetTemplateChild("MediaControlsCommandBar");

        //the event to control the dynamicoverflow automatically.
        barr.DynamicOverflowItemsChanging += (s, e) =>
        {
            if (_secondarycontrols.Items.Count == 0 && e.Action == CommandBarDynamicOverflowAction.AddingToOverflow)
                _moreButton.Visibility = Visibility.Visible;
            else if (_secondarycontrols.Items.Count == 1 && e.Action == CommandBarDynamicOverflowAction.RemovingFromOverflow)
                _moreButton.Visibility = Visibility.Collapsed;
        };

        //base implementation
        base.OnApplyTemplate();
    }

如您所见,在事件中我动态检查了 secondayoverflow 菜单中的项目数并相应地控制更多按钮的可见性。这显然是一种解决方法,但如果有人找到 MediaTransportControls commandbar 出现此错误的正确原因,请 post 对此 post.

做另一个回答

另请注意,FindDescendent 方法来自 uwp 社区工具包扩展 nuget 包。