当你在 UWP 应用中创建 AppBar 或 CommandBar 时,总是有一个省略号隐藏在控件的一侧,如下所示:
我不想在我的应用程序中使用它,但我没有找到任何AppBar
可以帮助我摆脱它的方法/属性。这应该是可能的,因为许多默认的 Windows 10 应用程序都没有它。例如,下面的主菜单栏上没有省略号:
是否可以使用 隐藏省略号AppBar
,或者我是否必须使用 aSplitView
或其他控件来实现它?
当你在 UWP 应用中创建 AppBar 或 CommandBar 时,总是有一个省略号隐藏在控件的一侧,如下所示:
我不想在我的应用程序中使用它,但我没有找到任何AppBar
可以帮助我摆脱它的方法/属性。这应该是可能的,因为许多默认的 Windows 10 应用程序都没有它。例如,下面的主菜单栏上没有省略号:
是否可以使用 隐藏省略号AppBar
,或者我是否必须使用 aSplitView
或其他控件来实现它?
首先,尽量不要AppBar
在新的 UWP 应用中使用。
通用 Windows 应用程序的 CommandBar 控件已得到改进,以提供 AppBar 功能的超集,并在您如何在应用程序中使用它时提供更大的灵活性。对于 Windows 10 上的所有新的通用 Windows 应用程序,您应该使用 CommandBar。
你可以在这里阅读更多关于它的信息。
两者CommandBar
都AppBar
可以完全样式化和模板化。这使您能够删除您不想显示的任何 UI 元素。
你就是这样做的——
在 Blend 中打开您的页面,右键单击CommandBar
> Edit Template > Edit a Copy。然后确保您选择了在应用程序中定义,因为当前在 Blend 中存在一个错误,如果您选择This document将无法生成样式。
获得所有样式后,找到MoreButton
控件并将其设置Visibility
为Collapsed
(或者您可以将其删除,但如果您意识到以后需要它怎么办?)。
那么你应该有一个CommandBar
没有省略号的。
2017 年更新
省略号按钮的可见性现在可以在 a 的OverflowButtonVisibility
属性中找到CommandBar
。如上所述将其设置Collapsed
为隐藏它。
如果您想全局隐藏此按钮,则添加
<Style x:Key="EllipsisButton" TargetType="Button">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
到全局资源文件
我知道这个问题不再活跃,但为了完成我提出我的答案。
我没有使用样式更改可见性,而是编写了一个 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
是另一种迭代可视化树的扩展方法。如果您的解决方案尚未包含它,您可能想要创建或获取一个。
由于我无法对特定答案添加评论,因此我将在此处发布。
以下页面提供了许多示例,这些示例将找到子对象以补充 @RadiusK 的答案。
在 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");
在@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;
}
}
}