1

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

问题

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

我还使用命令栏的重新模板样式,因为我想将主命令按钮的水平对齐设置为中心。

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

全窗口大小

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

较小的窗口

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

更新 1

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

添加了普通命令栏

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

更多按钮在这里工作

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

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

4

1 回答 1

1

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

在我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");
}

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

    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 包。

于 2018-04-04T14:08:39.950 回答