Подтвердить что ты не робот

Скрытие эллипса в AppBar

Когда вы создаете AppBar или CommandBar в приложении UWP, всегда рядом с элементом управления скрывается многоточие, например:

верхний правый угол

Я не хочу этого в моем приложении, но я не нашел никаких методов/свойств в AppBar, которые помогли бы мне избавиться от него. Это должно быть возможно, потому что многие из приложений Windows 10 по умолчанию этого не имеют. Например, в верхней строке меню нет эллипсиса:

введите описание изображения здесь

Можно ли скрыть эллипсис с помощью AppBar, или мне нужно использовать SplitView или какой-либо другой элемент управления для его реализации?

4b9b3361

Ответ 1

Во-первых, не пытайтесь использовать AppBar в новых приложениях UWP.

Элемент управления CommandBar для универсальных приложений Windows был улучшен до обеспечивают надстройку функциональности AppBar и большую гибкость в как вы можете использовать его в своем приложении. Вы должны использовать CommandBar для всех новых универсальных приложений Windows на Windows 10.

Подробнее об этом можно узнать здесь.

Оба CommandBar и AppBar могут быть заполнены стилями и шаблонами. Это дает вам возможность удалять все элементы пользовательского интерфейса, которые вы не хотите отображать.

Вот как вы это делаете -

Откройте свою страницу в Blend, щелкните правой кнопкой мыши по CommandBar > "Редактировать шаблон" > "Редактировать копию". Затем убедитесь, что вы выбрали "Определить в приложении", поскольку в настоящее время есть ошибка в Blend, которая не сможет сгенерировать стили, если вы выберете "Этот документ".

Как только у вас есть все стили, найдите элемент управления MoreButton и установите его Visibility на Collapsed (или вы можете удалить его, но что, если вы понимаете, что вам это нужно позже?).

Тогда вы должны иметь CommandBar без эллипса.

Обновление для 2017 Видимость кнопки Ellipsis теперь можно найти в свойстве OverflowButtonVisibility a CommandBar. Как указано выше, установите Collapsed, чтобы скрыть его.

Ответ 2

Если вы хотите скрыть эту кнопку глобально, достаточно добавить

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

в файл глобальных ресурсов

Ответ 3

Я знаю, что этот вопрос уже неактивен, но ради завершения я предлагаю свой ответ.

Вместо изменения видимости с помощью стилей я написал расширение AttachedProperty, которое может скрыть/показать MoreButton с помощью привязки данных. Таким образом, вы можете показать/скрыть его условно, как вам нравится.

Использование так же просто, как привязать ваше свойство к расширению:

<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 - это другой метод расширения, который выполняет итерацию визуального дерева. Вы можете создать или захватить один, если ваше решение еще не содержит его.

Ответ 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 name is set for search
            if (frameworkElement != null && frameworkElement.Name == childName)
            {
                // if the child 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");

Ответ 5

Основываясь на ответе @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;
        }
    }
}