MenuFlyout 类

定义

表示显示命令菜单的浮出控件。

/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.UI.Xaml.Markup.ContentProperty(Name="Items")]
class MenuFlyout : FlyoutBase
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.UI.Xaml.Markup.ContentProperty(Name="Items")]
public class MenuFlyout : FlyoutBase
Public Class MenuFlyout
Inherits FlyoutBase
<MenuFlyout>
  oneOrMoreItems
</MenuFlyout>
继承
Object IInspectable DependencyObject FlyoutBase MenuFlyout
派生
属性

Windows 要求

设备系列
Windows 10 (在 10.0.10240.0 中引入)
API contract
Windows.Foundation.UniversalApiContract (在 v1.0 中引入)

示例

提示

有关详细信息、设计指南和代码示例,请参阅 菜单和上下文菜单

如果已安装 WinUI 2 库 应用,请单击此处 打开该应用,并查看 MenuFlyout 的运行情况

此示例将创建 MenuFlyout 类,并使用 ContextFlyout 属性(该属性适用于大多数控件),以显示 MenuFlyout 类作为上下文菜单。

<Rectangle Height="100" Width="100">
  <Rectangle.ContextFlyout>
    <MenuFlyout>
      <MenuFlyoutItem Text="Change color" Click="ChangeColorItem_Click" />
    </MenuFlyout>
  </Rectangle.ContextFlyout>
  <Rectangle.Fill>
    <SolidColorBrush x:Name="rectangleFill" Color="Red" />
  </Rectangle.Fill>
</Rectangle>
private void ChangeColorItem_Click(object sender, RoutedEventArgs e)
{
    // Change the color from red to blue or blue to red.
    if (rectangleFill.Color == Windows.UI.Colors.Red)
    {
        rectangleFill.Color = Windows.UI.Colors.Blue;
    }
    else
    {
        rectangleFill.Color = Windows.UI.Colors.Red;
    }
}

下一个示例几乎完全相同,但该示例使用 FlyoutBase.ShowAttachedFlyout 属性将其显示为菜单,而不是使用 ContextFlyout 属性来显示 MenuFlyout 类作为上下文菜单。

<Rectangle
  Height="100" Width="100"
  Tapped="Rectangle_Tapped">
  <FlyoutBase.AttachedFlyout>
    <MenuFlyout>
      <MenuFlyoutItem Text="Change color" Click="ChangeColorItem_Click" />
    </MenuFlyout>
  </FlyoutBase.AttachedFlyout>
  <Rectangle.Fill>
    <SolidColorBrush x:Name="rectangleFill" Color="Red" />
  </Rectangle.Fill>
</Rectangle>
private void Rectangle_Tapped(object sender, TappedRoutedEventArgs e)
{
    FlyoutBase.ShowAttachedFlyout((FrameworkElement)sender);
}

private void ChangeColorItem_Click(object sender, RoutedEventArgs e)
{
    // Change the color from red to blue or blue to red.
    if (rectangleFill.Color == Windows.UI.Colors.Red)
    {
        rectangleFill.Color = Windows.UI.Colors.Blue;
    }
    else
    {
        rectangleFill.Color = Windows.UI.Colors.Red;
    }
}

此示例演示如何根据应用中的更改条件在运行时添加和删除菜单项。

<StackPanel Margin="40" Width="220">
    <Rectangle x:Name="Rect1" Height="100" Width="200" 
               Stroke="Black" StrokeThickness="1" Fill="White">
        <Rectangle.ContextFlyout>
            <MenuFlyout x:Name="RectangleColorMenu"/>
        </Rectangle.ContextFlyout>
    </Rectangle>

    <StackPanel>
        <TextBlock TextWrapping="WrapWholeWords"
                   Text="Check colors to include in the menu, then choose a color from the context menu on the rectangle."/>
        <CheckBox Content="Blue" Click="CheckBox_Click" Tag="blue"/>
        <CheckBox Content="Green" Click="CheckBox_Click" Tag="green"/>
        <CheckBox Content="Red" Click="CheckBox_Click" Tag="red"/>
        <CheckBox Content="Yellow" Click="CheckBox_Click" Tag="yellow"/>
    </StackPanel>
</StackPanel>
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
    // Using the Tag property lets you localize the display name
    // without affecting functionality.
    var cb = (CheckBox)sender;
    if (cb.IsChecked == true)
    {
        AddMenuItem(cb.Tag.ToString(), cb.Content.ToString());
    }
    else
    {
        RemoveMenuItem(cb.Content.ToString());
    }
}

private void AddMenuItem(string colorString, string locColorName)
{
    // Set the color.
    Color newColor = Colors.Blue;
    if (colorString == "green")
        newColor = Colors.Green;
    else if (colorString == "red")
        newColor = Colors.Red;
    else if (colorString == "yellow")
        newColor = Colors.Yellow;

    // Create the menu item.
    var newMenuItem = new MenuFlyoutItem();
    newMenuItem.Text = locColorName;
    newMenuItem.Click += (s, e1) =>
    {
        Rect1.Fill = new SolidColorBrush(newColor);
    };

    // Add the item to the menu.
    RectangleColorMenu.Items.Add(newMenuItem);

    // Sort the menu so it's always consistent.
    var orderedItems =  RectangleColorMenu.Items.OrderBy(i => ((MenuFlyoutItem)i).Text).ToList();
    RectangleColorMenu.Items.Clear();
    foreach (var item in orderedItems)
    {
        RectangleColorMenu.Items.Add(item);
    }
}

private void RemoveMenuItem(string locColorName)
{
    // Get any menu items to remove and remove them.
    var items = RectangleColorMenu.Items.Where(i => ((MenuFlyoutItem)i).Text == locColorName);
    foreach (MenuFlyoutItem item in items)
    {
        RectangleColorMenu.Items.Remove(item);
    }
}

注解

提示

有关详细信息、设计指南和代码示例,请参阅 菜单和上下文菜单

MenuFlyout 暂时显示与用户当前正在执行的操作相关的命令或选项列表。

菜单浮出控件控制

使用 浮出控件 显示单个项,使用 MenuFlyout 控件显示项菜单。 有关详细信息,请参阅 菜单和上下文菜单

MenuFlyout 控件可用作 Button.Flyout 属性的值。 这通常在 XAML 中设置为页面 UI 定义的一部分。 Button 是唯一具有专用 浮出控件 属性的控件。 设置为 Button.Flyout 时,当点击或以其他方式调用按钮时,MenuFlyout 将显示。

若要将 MenuFlyout 与其他控件相关联,请使用任何 UIElement 上可用的 ContextFlyout 属性。

以前版本的说明

注意

在 Windows 10 周年更新 (SDK 版本 14393) 之前,ContextFlyout 属性不可用。 对于早期版本,请使用 FlyoutBase.AttachedFlyout 附加属性。

可以使用 FlyoutBase.AttachedFlyout 附加属性将 MenuFlyout 与其他控件相关联。 使用 FlyoutBase.AttachedFlyout 将 MenuFlyout 分配给其他 UI 元素时,必须调用 ShowAt 方法或静态 ShowAttachedFlyout 方法来显示浮出控件。

除了上面列出的成员外,基类 FlyoutBase 的其他成员通常用于典型的 MenuFlyout 方案:

控件样式和模板

可以修改默认 的 StyleControlTemplate ,为控件提供唯一的外观。 有关修改控件的样式和模板的信息,请参阅 设置控件样式。 文件中包含 generic.xaml 定义控件外观的默认样式、模板和资源。 出于设计目的, generic.xaml 可通过 SDK 或 NuGet 包安装在本地使用。

  • 建议) (WinUI 样式 有关 WinUI 中更新的样式,请参阅 \Users\<username>\.nuget\packages\microsoft.ui.xaml\<version>\lib\uap10.0\Microsoft.UI.Xaml\Themes\generic.xaml
  • 非 WinUI 样式: 有关内置样式,请参阅 %ProgramFiles(x86)%\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAP\<SDK version>\Generic\generic.xaml

如果自定义安装,位置可能会有所不同。 不同版本的 SDK 的样式和资源可能具有不同的值。

XAML 还包括可用于在不修改控件模板的情况下修改不同视觉状态下控件颜色的资源。 修改这些资源优先于设置 背景前台等属性。 有关详细信息,请参阅 XAML 样式一文的轻量级样式部分。 从 Windows 10 版本 1607 (SDK 14393) 开始提供轻量级样式资源。

版本历史记录

Windows 版本 SDK 版本 增值
1809 17763 ShowAt

构造函数

MenuFlyout()

初始化 MenuFlyout 类的新实例。

属性

AllowFocusOnInteraction

获取或设置一个值,该值指示当用户与元素交互时是否自动获取焦点。

(继承自 FlyoutBase)
AllowFocusWhenDisabled

获取或设置一个值,该值指定控件在禁用时是否可以接收焦点。

(继承自 FlyoutBase)
AreOpenCloseAnimationsEnabled

获取或设置一个值,该值指示在打开还是关闭浮出控件时播放动画。

(继承自 FlyoutBase)
Dispatcher

获取与此对象关联的 CoreDispatcherCoreDispatcher 表示可以访问 UI 线程上的 DependencyObject 的工具,即使代码是由非 UI 线程启动的。

(继承自 DependencyObject)
ElementSoundMode

获取或设置一个值,该值指定控件是否播放声音的首选项。

(继承自 FlyoutBase)
InputDevicePrefersPrimaryCommands

获取一个值,该值指示用于打开浮出控件的输入设备是否不容易打开辅助命令。

(继承自 FlyoutBase)
IsConstrainedToRootBounds

获取一个值,该值指示浮出控件是否显示在 XAML 根的边界内。

(继承自 FlyoutBase)
IsOpen

获取一个值,该值指示浮出控件是否处于打开状态。

(继承自 FlyoutBase)
Items

获取用于生成菜单内容的集合。

LightDismissOverlayMode

获取或设置一个值,该值指定是否将 浅色消除 UI 外部的区域变暗。

(继承自 FlyoutBase)
MenuFlyoutPresenterStyle

获取或设置呈现 MenuFlyout 时使用的样式。

MenuFlyoutPresenterStyleProperty

标识 MenuFlyoutPresenterStyle 依赖属性。

OverlayInputPassThroughElement

获取或设置一个元素,该元素应接收指针输入事件,即使在浮出控件的覆盖层下也是如此。

(继承自 FlyoutBase)
Placement

获取或设置浮出控件相对于其放置目标的默认放置。

(继承自 FlyoutBase)
ShouldConstrainToRootBounds

获取或设置一个值,该值指示是否应在 XAML 根的边界内显示浮出控件。

(继承自 FlyoutBase)
ShowMode

获取或设置一个值,该值指示浮出控件在显示时的行为方式。

(继承自 FlyoutBase)
Target

获取要用作浮出控件放置目标的元素。

(继承自 FlyoutBase)
XamlRoot

获取或设置在其中查看此浮出控件的 XamlRoot。

(继承自 FlyoutBase)

方法

ClearValue(DependencyProperty)

清除依赖属性的本地值。

(继承自 DependencyObject)
CreatePresenter()

在派生类中重写时,初始化控件以显示适合派生控件的浮出控件内容。 注意:此方法没有基类实现,必须在派生类中重写。

(继承自 FlyoutBase)
GetAnimationBaseValue(DependencyProperty)

返回为依赖属性建立的任何基值,该基值适用于动画未处于活动状态的情况。

(继承自 DependencyObject)
GetValue(DependencyProperty)

DependencyObject 返回依赖属性的当前有效值。

(继承自 DependencyObject)
Hide()

关闭浮出控件。

(继承自 FlyoutBase)
OnProcessKeyboardAccelerators(ProcessKeyboardAcceleratorEventArgs)

在应用中处理键盘快捷方式 (快捷键) 之前调用。 每当应用程序代码或内部进程调用 ProcessKeyboardAccelerators 时调用。 重写此方法以影响默认加速器处理。

(继承自 FlyoutBase)
ReadLocalValue(DependencyProperty)

如果设置了本地值,则返回依赖属性的本地值。

(继承自 DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

注册通知函数,用于侦听此 DependencyObject 实例上对特定 DependencyProperty 的更改。

(继承自 DependencyObject)
SetValue(DependencyProperty, Object)

设置 DependencyObject 上依赖属性的本地值。

(继承自 DependencyObject)
ShowAt(DependencyObject, FlyoutShowOptions)

显示使用指定选项相对于指定元素放置的浮出控件。

(继承自 FlyoutBase)
ShowAt(FrameworkElement)

显示相对于指定元素放置的浮出控件。

(继承自 FlyoutBase)
ShowAt(UIElement, Point)

显示相对于指定目标元素放置在指定偏移量的浮出控件。

TryInvokeKeyboardAccelerator(ProcessKeyboardAcceleratorEventArgs)

尝试 (快捷键) 调用键盘快捷方式。

(继承自 FlyoutBase)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

取消以前通过调用 RegisterPropertyChangedCallback 注册的更改通知。

(继承自 DependencyObject)

事件

Closed

浮出控件隐藏时发生。

(继承自 FlyoutBase)
Closing

浮出控件开始隐藏时发生。

(继承自 FlyoutBase)
Opened

在显示浮出控件时发生。

(继承自 FlyoutBase)
Opening

在显示浮出控件之前发生。

(继承自 FlyoutBase)

适用于

另请参阅