16

当你在 UWP 应用中创建 AppBar 或 CommandBar 时,总是有一个省略号隐藏在控件的一侧,如下所示:

右上角

我不想在我的应用程序中使用它,但我没有找到任何AppBar可以帮助我摆脱它的方法/属性。这应该是可能的,因为许多默认的 Windows 10 应用程序都没有它。例如,下面的主菜单栏上没有省略号:

在此处输入图像描述

是否可以使用 隐藏省略号AppBar,或者我是否必须使用 aSplitView或其他控件来实现它?

4

5 回答 5

25

首先,尽量不要AppBar在新的 UWP 应用中使用。

通用 Windows 应用程序的 CommandBar 控件已得到改进,以提供 AppBar 功能的超集,并在您如何在应用程序中使用它时提供更大的灵活性。对于 Windows 10 上的所有新的通用 Windows 应用程序,您应该使用 CommandBar。

你可以在这里阅读更多关于它的信息。

两者CommandBarAppBar可以完全样式化和模板化。这使您能够删除您不想显示的任何 UI 元素。

你就是这样做的——

在 Blend 中打开您的页面,右键单击CommandBar > Edit Template > Edit a Copy。然后确保您选择了在应用程序中定义,因为当前在 Blend 中存在一个错误,如果您选择This document将无法生成样式。

获得所有样式后,找到MoreButton控件并将其设置VisibilityCollapsed(或者您可以将其删除,但如果您意识到以后需要它怎么办?)。

那么你应该有一个CommandBar没有省略号的。

2017 年更新 省略号按钮的可见性现在可以在 a 的OverflowButtonVisibility属性中找到CommandBar。如上所述将其设置Collapsed为隐藏它。

于 2015-08-03T23:53:55.060 回答
10

如果您想全局隐藏此按钮,则添加

<Style x:Key="EllipsisButton" TargetType="Button">
    <Setter Property="Visibility" Value="Collapsed"/>
</Style>

到全局资源文件

于 2015-11-12T09:34:59.787 回答
7

我知道这个问题不再活跃,但为了完成我提出我的答案。

我没有使用样式更改可见性,而是编写了一个 AttachedProperty 扩展,该扩展能够通过数据绑定隐藏/显示更多按钮。这样您就可以根据需要有条件地显示/隐藏它。

使用就像将你的属性绑定到扩展一样简单:

<CommandBar extensions:CommandBarExtensions.HideMoreButton="{Binding MyBoolean}">
    ...
</CommandBar>

扩展代码如下:

public static class CommandBarExtensions
{
    public static readonly DependencyProperty HideMoreButtonProperty =
        DependencyProperty.RegisterAttached("HideMoreButton", typeof(bool), typeof(CommandBarExtensions), 
            new PropertyMetadata(false, OnHideMoreButtonChanged));

    public static bool GetHideMoreButton(UIElement element)
    {
        if (element == null) throw new ArgumentNullException(nameof(element));
        return (bool)element.GetValue(HideMoreButtonProperty);
    }

    public static void SetHideMoreButton(UIElement element, bool value)
    {
        if (element == null) throw new ArgumentNullException(nameof(element));
        element.SetValue(HideMoreButtonProperty, value);
    }

    private static void OnHideMoreButtonChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var commandBar = d as CommandBar;
        if (e == null || commandBar == null || e.NewValue == null) return;
        var morebutton = commandBar.FindDescendantByName("MoreButton");
        if (morebutton != null)
        {
            var value = GetHideMoreButton(commandBar);
            morebutton.Visibility = value ? Visibility.Collapsed : Visibility.Visible;
        }
        else
        {
            commandBar.Loaded += CommandBarLoaded;
        }
    }

    private static void CommandBarLoaded(object o, object args)
    {
        var commandBar = o as CommandBar;
        var morebutton = commandBar?.FindDescendantByName("MoreButton");
        if (morebutton == null) return;
        var value = GetHideMoreButton(commandBar);
        morebutton.Visibility = value ?  Visibility.Collapsed : Visibility.Visible;
        commandBar.Loaded -= CommandBarLoaded;
    }
}

在初始绑定时,它使用 Loaded 事件在加载后应用隐藏。这FindDescendantByName是另一种迭代可视化树的扩展方法。如果您的解决方案尚未包含它,您可能想要创建或获取一个。

于 2016-03-08T19:14:09.247 回答
4

由于我无法对特定答案添加评论,因此我将在此处发布。

以下页面提供了许多示例,这些示例将找到子对象以补充 @RadiusK 的答案。

如何按名称或类型查找 WPF 控件?

在 UWP 中专门为我工作的是:

/// <summary>
/// Finds a Child of a given item in the visual tree. 
/// </summary>
/// <param name="parent">A direct parent of the queried item.</param>
/// <typeparam name="T">The type of the queried item.</typeparam>
/// <param name="childName">x:Name or Name of child. </param>
/// <returns>The first parent item that matches the submitted type parameter. 
/// If not matching item can be found, 
/// a null parent is being returned.</returns>
public static T FindChild<T>(DependencyObject parent, string childName) where T : DependencyObject
{
    // Confirm parent and childName are valid. 
    if (parent == null)
        return null;

    T foundChild = null;

    int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < childrenCount; i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);

        // If the child is not of the request child type child
        T childType = child as T;
        if (childType == null)
        {
            // recursively drill down the tree
            foundChild = FindChild<T>(child, childName);

            // If the child is found, break so we do not overwrite the found child. 
            if (foundChild != null)
                break;
        }
        else if (!string.IsNullOrEmpty(childName))
        {
            var frameworkElement = child as FrameworkElement;

            // If the child's name is set for search
            if (frameworkElement != null && frameworkElement.Name == childName)
            {
                // if the child's name is of the request name
                foundChild = (T)child;
                break;
            }
        }
        else
        {
            // child element found.
            foundChild = (T)child;
            break;
        }
    }

    return foundChild;
}

像这样调用代码:

var morebutton = FindChild<Button>(commandBar, "MoreButton");
于 2016-06-27T13:33:05.827 回答
0

在@RadiusK 的回答(有一些问题)的基础上,我想出了一个经过测试和工作的更简洁的替代方案:

using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;

namespace Linq
{
    public static class CommandBarExtensions
    {
        public static readonly DependencyProperty HideMoreButtonProperty = DependencyProperty.RegisterAttached("HideMoreButton", typeof(bool), typeof(CommandBarExtensions), new PropertyMetadata(false, OnHideMoreButtonChanged));
        public static bool GetHideMoreButton(CommandBar d)
        {
            return (bool)d.GetValue(HideMoreButtonProperty);
        }
        public static void SetHideMoreButton(CommandBar d, bool value)
        {
            d.SetValue(HideMoreButtonProperty, value);
        }
        static void OnHideMoreButtonChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var CommandBar = d as CommandBar;
            if (CommandBar != null)
            {
                var MoreButton = CommandBar.GetChild<Button>("MoreButton") as UIElement;
                if (MoreButton != null)
                {
                    MoreButton.Visibility = !(e.NewValue as bool) ? Visibility.Visible : Visibility.Collapsed;
                }
                else CommandBar.Loaded += OnCommandBarLoaded;
            }
        }

        static void OnCommandBarLoaded(object sender, RoutedEventArgs e)
        {
            var CommandBar = sender as CommandBar;

            var MoreButton = CommandBar?.GetChild<Button>("MoreButton") as UIElement;
            if (MoreButton != null)
            {
                MoreButton.Visibility = !(GetHideMoreButton(CommandBar) as bool) ? Visibility.Visible : Visibility.Collapsed;
                CommandBar.Loaded -= OnCommandBarLoaded;
            }
        }

        public static T GetChild<T>(this DependencyObject Parent, string Name) where T : DependencyObject
        {
            if (Parent != null)
            {
                for (int i = 0, Count = VisualTreeHelper.GetChildrenCount(Parent); i < Count; i++)
                {
                    var Child = VisualTreeHelper.GetChild(Parent, i);

                    var Result = Child is T && !string.IsNullOrEmpty(Name) && (Child as FrameworkElement)?.Name == Name ? Child as T : Child.GetChild<T>(Name);
                    if (Result != null)
                        return Result;
                }
            }
            return null;
        }
    }
}
于 2017-03-12T01:41:49.403 回答