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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uwp命令栏更多按钮未显示DynamicOverflowEnabled相关的知识,希望对你有一定的参考价值。

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

问题

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

此外,我正在使用命令栏的retemplated样式,因为我想将主命令按钮的horizo​​ntalAlignment设置为center。

为了让你更简单,我已经制作了一个样本仓库来重现这个问题,只需克隆仓库,运行应用程序并调整窗口大小以注意更多按钮永远不会出现。

https://github.com/touseefbsb/CommandBarOverflowBug

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

full window size

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

smaller size window

另请注意,app项目将创建者更新为最小目标,因此DynamicOverflow应该可以正常工作,因为它是在周年纪念更新中引入的。

更新1

在下面的图片中你可以看到我在页面上添加了一个正常的命令栏,即使没有溢出按钮,它也会显示更多按钮。很明显,我猜测它是标签。

normal commandbar added

在这里你可以看到,在调整大小时,更多按钮可以获得额外的按钮。

more button works here

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

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

答案

在使用我的自定义控件进行大量操作之后,我必须动态地覆盖行为并创建一些我自己的行为才能使其工作。

我在控件的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命令栏有这个错误,请在这篇文章上发布另一个答案。谢谢。

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

以上是关于uwp命令栏更多按钮未显示DynamicOverflowEnabled的主要内容,如果未能解决你的问题,请参考以下文章

UWP-标题栏”后退“按钮

当用户在 UIActivityViewController 上点击“更多”时如何设置导航栏按钮?

UWP-标题栏”后退“按钮

无法单击 UWP 自定义标题栏按钮

分段按钮未显示在 iPhone 的导航栏上

标签栏 UIViewController 中导航栏中的按钮未显示