WPF基础五:UI④ 条目控件Menu

Object->DispatcherObject->DependencyObject->Visual->UIElement->FrameworkElement->Control->ItemsControl->MenuBase->Menu


Menu

表示一个 Windows 菜单控件,该控件可用于按层次组织与命令和事件处理程序关联的元素。

Menu控件提供了一个项列表,这些项指定了应用程序的命令或选项。 通常,单击菜单上的项将打开子菜单或使应用程序执行命令。

Menu 是 ItemsControl ,这意味着它可以包含任何类型的对象的集合 (例如字符串、图像或面板) 。 有关更多信息,请参见 ItemsControl 类。 MenuItem是 Menu 中最常见的项类型。 MenuItem可以包含子项。 当用户选择父项时,子菜单项将出现在 MenuItem 子菜单中。

自定义菜单控件

若要对多个 Menu 控件应用相同的属性设置,请使用 Style 属性。 您可以修改 ControlTemplate默认值 ,为控件指定独特的外观。 有关创建 ControlTemplate 的详细信息,请参阅 通过创建 System.windows.controls.controltemplate> 自定义现有控件的外观。 若要查看特定于Menu 的部分和状态,请 参阅 菜单样式和模板

此控件的依赖属性可能由控件的默认样式设置。 如果按默认样式设置属性,则当控件出现在应用程序中时,属性可能会更改为默认值。 默认样式取决于应用程序运行时使用的桌面主题。 有关详细信息,请参阅 默认的 WPF 主题

只有视觉对象属性已存在于控件的默认模板中并且已使用 TemplateBinding 设置时,设置该属性才有效。 在通过创建 ControlTemplate 自定义现有控件的外观一文的更改控件的视觉结构部分可以找到视觉属性列表。

名称备注权限

IsMainMenuProperty

标识 IsMainMenu 依赖项属性。public static readonly
名称备注权限

IsMainMenu

获取或设置一个值,该值指示此 Menu 是否接收主菜单激活通知。get; set;
名称备注权限

HandleMouseButton

在按下或释放任意鼠标按钮时调用。protected

OnCreateAutomationPeer

提供 MenuAutomationPeer 此控件的适当实现,作为 WPF 自动化基础结构的一部分。protected

OnInitialized

当 IsInitialized 属性设置为 true 时调用。protected

OnKeyDown

响应 KeyDown 事件。protected

OnTextInput

处理 TextInput 路由事件,该事件在菜单接收来自任何设备的文本输入时发生。protected

PrepareContainerForItemOverride

准备好指定的元素以显示指定的项。protected

MenuItem

表示 Menu 内某个可选择的项。

MenuItem 是一个 HeaderedItemsControl ,它表示对象的标头和集合可以是任何类型 (例如字符串、图像或面板) 。 有关更多信息,请参见 HeaderedItemsControl 类。

MenuItem可以具有子菜单。MenuItem  的子菜单由 MenuItem 的中的ItemCollection 对象组成 。 通常, MenuItem 包含其他 MenuItem 对象来创建嵌套的子菜单。

MenuItem可以具有以下多个函数之一:

  • 可以选择它来调用命令。

  • 它可以是其他菜单项的分隔符。

  • 它可以是子菜单的标头。

  • 可以选中或取消选中此项。

 备注

默认情况下,MenuItem 的 HorizontalAlignment 设置为 HorizontalAlignment.Stretch 。 StackPanel 的默认水平位置 是 HorizontalAlignment.Center 。 如果通过StackPanel 设置MenuItem 的Width 属性,则将StackPanel 的默认值传递给MenuItem ,将项目居中。

MenuItem的MouseDown事件,如果您用一个的MouseDown事件来处理,你的处理方法将永远不会被调用。要添加自己的处理程序,订阅PreviewMouseDown事件或订阅MouseDown通过调用 AddHandler(RoutedEvent, Delegate, Boolean)handledEventsToo设置为true

若要将相同的属性设置应用于多个MenuItem控件,请使用“样式”属性。您可以修改默认的ControlTemplate以使控件具有唯一的外观。有关创建ControlTemplate的更多信息,请参见通过创建ControlTemplate自定义现有控件的外观。若要查看特定于MenuItem的部分和状态,请参见菜单样式和模板

此控件的依赖项属性可以由控件的默认样式设置。如果使用默认样式设置属性,则当控件出现在应用程序中时,该属性可能会从其默认值更改。默认样式由运行应用程序时使用的桌面主题确定。有关更多信息,请参见默认WPF主题

Note

设置视觉属性仅在该属性同时存在于控件的默认模板中并且通过使用TemplateBinding进行设置时才有效。您可以在通过创建ControlTemplate定制现有控件的外观的更改控件的视觉结构”部分中找到视觉属性列表。


 

名称备注权限

CheckedEvent

标识 Checked 路由事件。public static readonly

ClickEvent

标识 Click 路由事件。public static readonly

CommandParameterProperty

标识 CommandParameter 依赖项属性。public static readonly

CommandProperty

标识 Command 依赖项属性。public static readonly

CommandTargetProperty

标识 CommandTarget 依赖项属性。public static readonly

IconProperty

标识 Icon 依赖项属性。public static readonly

InputGestureTextProperty

标识 InputGestureText 依赖项属性。public static readonly

IsCheckableProperty

标识 IsCheckable 依赖项属性。public static readonly

IsCheckedProperty

标识 IsChecked 依赖项属性。public static readonly

IsHighlightedProperty

标识 IsHighlighted 依赖项属性。public static readonly

IsPressedProperty

标识 IsPressed 依赖项属性。public static readonly

IsSubmenuOpenProperty

标识 IsSubmenuOpen 依赖项属性。public static readonly

IsSuspendingPopupAnimationProperty

标识 IsSuspendingPopupAnimation 依赖项属性。public static readonly

ItemContainerTemplateSelectorProperty

 

标识 ItemContainerTemplateSelector 依赖项属性。public static readonly

RoleProperty

标识 Role 依赖项属性。public static readonly

StaysOpenOnClickProperty

标识 StaysOpenOnClick 依赖项属性。public static readonly

SubmenuClosedEvent

标识 SubmenuClosed 路由事件。public static readonly

SubmenuOpenedEvent

标识 SubmenuOpened 路由事件。public static readonly

UncheckedEvent

标识 Unchecked 路由事件。public static readonly

UsesItemContainerTemplateProperty

标识 UsesItemContainerTemplate 依赖项属性。public static readonly
名称备注权限

Command

获取或设置与菜单项关联的命令。get; set;

CommandParameter

获取或设置要传递给 Command 的 MenuItem 属性的参数。get; set;

CommandTarget

获取或设置在其上引发指定命令的目标元素。get; set;

HandlesScrolling

获取控件是否支持滚动。get;

Icon

获取或设置显示在 MenuItem 中的图标。get; set;

InputGestureText

设置文本,以描述将调用与指定项关联的命令的输入笔势。get; set;

IsCheckable

获取一个指示是否可选中 MenuItem 的值。get;

IsChecked

获取或设置一个指示是否选中 MenuItem 的值。get; set;

IsEnabledCore

获取一个值,该值指示当前菜单项的 IsEnabled 属性是否为 trueget;

IsHighlighted

获取一个指示是否突出显示 MenuItem 的值。get;

IsPressed

获取一个指示是否按下 MenuItem 的值。get;

IsSubmenuOpen

获取或设置一个值,该值指示是否打开 MenuItem 的子菜单。get; set;

IsSuspendingPopupAnimation

获取菜单是否对其 Popup 控件挂起动画。get;

ItemContainerTemplateSelector

获取或设置用于选择用来显示每个项的模板的自定义逻辑。get; set;

Role

获取一个值,该值指示 MenuItem 的角色。get;

SeparatorStyleKey

获取当 MenuItem 为 MenuItem 时应用于 Separator 的样式的资源键。get;

StaysOpenOnClick

获取或设置一个值,该值指示在单击此 MenuItem 时,该项所在的子菜单不应关闭。get; set;

SubmenuHeaderTemplateKey

获取当 MenuItem 为子菜单标头时应用于 MenuItem 的样式的资源键。get;

SubmenuItemTemplateKey

获取当 MenuItem 为子菜单时应用于 MenuItem 的样式的资源键。get;

TopLevelHeaderTemplateKey

获取当 MenuItem 为顶级菜单标头时应用于 MenuItem 的样式的资源键。get;

TopLevelItemTemplateKey

获取当 MenuItem 为可调用命令的顶级 MenuItem 时应用于它的样式的资源键。get;

UsesItemContainerTemplate

获取或设置指示菜单是根据基础集合中项的类型还是一些其他的启发方法来选择不同的项容器的值。get; set;
名称备注权限

GetContainerForItemOverride

创建或标识用于显示指定项的元素。protected

IsItemItsOwnContainerOverride

确定指定项是否是(或者是否可以作为)自己的 ItemContainerprotected

OnAccessKey

在调用此控件的 AccessKey 时响应protected

OnApplyTemplate

在生成模板树时调用。public

OnChecked

在 IsChecked 属性变为 true 时调用。 此方法引发 Checked 路由事件。protected

OnClick

在单击 MenuItem 并引发 Click 事件时调用。protected

OnCreateAutomationPeer

提供 MenuItemAutomationPeer 此控件的适当实现,作为 WPF 自动化基础结构的一部分。protected

OnGotKeyboardFocus

宣布键盘焦点位于此元素上。protected

OnInitialized

在 IsInitialized 属性设置为 true 并引发 Initialized 事件时调用。protected

OnIsKeyboardFocusWithinChanged

当焦点不再在 MenuItem 之上或之内时调用。protected

OnItemsChanged

当 Items 属性更改时调用。protected

OnKeyDown

响应 KeyDown 事件。protected

OnMouseEnter

每当鼠标进入 MenuItem 时调用。protected

OnMouseLeave

每当鼠标离开 MenuItem 时调用。protected

OnMouseLeftButtonDown

在按下鼠标左键时调用。protected

OnMouseLeftButtonUp

在释放鼠标左键时调用。protected

OnMouseMove

在鼠标移到菜单项上时调用。protected

OnMouseRightButtonDown

在按下鼠标右键时调用。protected

OnMouseRightButtonUp

在释放鼠标右键时调用。protected

OnSubmenuClosed

在关闭 MenuItem 的子菜单时调用。protected

OnSubmenuOpened

在打开 MenuItem 的子菜单时调用。protected

OnUnchecked

在 IsChecked 属性变为 false 时调用。 此方法引发 Unchecked 路由事件。protected

OnVisualParentChanged

在可视 MenuItem 的父级更改时调用。protected

PrepareContainerForItemOverride

准备好指定的元素以显示指定的项。protected

ShouldApplyItemContainerStyle

用于确定是否对项容器应用样式。protected
名称备注

Checked

在选中菜单项时发生。

Click

在单击 MenuItem 时发生。

SubmenuClosed

在 IsSubmenuOpen 属性的状态更改为 false 时发生。

SubmenuOpened

在 IsSubmenuOpen 属性的状态更改为 true 时发生。

Unchecked

在未选中 MenuItem 时发生。

 


XAML范例

  • IsMainMenu属性的影响

  • 本例中Click和Command是相同效果,但是务必学会使用Command,这在MVVM中经常使用。

<Window x:Class="MenuDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MenuDemo"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <!--命令绑定-->
    <Window.Resources>
        <RoutedCommand x:Key="OpenCommand"/>
    </Window.Resources>
    <Window.CommandBindings>
        <CommandBinding Command="{StaticResource OpenCommand}" Executed="OnOpen"/>
    </Window.CommandBindings>
    <!--快捷键-->
    <Window.InputBindings>
        <KeyBinding Command="{StaticResource  OpenCommand}"  Gesture="Ctrl+O"/>
    </Window.InputBindings>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="20"/>
            <RowDefinition/>
            <RowDefinition Height="20"/>
        </Grid.RowDefinitions>
        <StackPanel>
            <Menu  IsMainMenu="False">
                <MenuItem Header="_File">
                    <MenuItem Header="_Open" Command="{StaticResource OpenCommand }" InputGestureText="Ctrl+O"/>
                    <MenuItem Header="_Closed" Click="OnClosed"/>
                </MenuItem>
                <MenuItem Header="_Edit"/>
            </Menu>
        </StackPanel>
        <StackPanel Grid.Row="2" >
            <Menu IsMainMenu="True">
                <MenuItem Header="_View" >
                    <MenuItem Header="_Left"/>
                    <MenuItem Header="_Right"/>
                </MenuItem>
                <MenuItem Header="_Help" />
            </Menu>
        </StackPanel>
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace MenuDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void OnOpen(object sender, ExecutedRoutedEventArgs e)
        {
            MessageBox.Show("你使用了Open命令!");
        }

        private void OnClosed(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
}

 


C#代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace MenuDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        
        public MainWindow()
        {
            InitializeComponent();
            RowDefinition row0 = new RowDefinition { Height = new GridLength(20.0)  };
            RowDefinition row1 = new RowDefinition ();
            RowDefinition row2 = new RowDefinition { Height = new GridLength(20.0) };
            (this.Content as Grid).RowDefinitions.Add(row0);
            (this.Content as Grid).RowDefinitions.Add(row1);
            (this.Content as Grid).RowDefinitions.Add(row2);

            Menu menu0 = new Menu { IsMainMenu = false };
            MenuItem menuFile = new MenuItem { Header= "_File" };

            RoutedCommand OpenCommand = new RoutedCommand();
            CommandBinding command = new CommandBinding {Command= OpenCommand};
            this.CommandBindings.Add(command);
            KeyBinding keyBinding = new KeyBinding { Command = OpenCommand };
            this.InputBindings.Add(keyBinding);
            keyBinding.Gesture = new KeyGesture(Key.O, ModifierKeys.Control);
            command.Executed += OnOpen;

            MenuItem menuOpen = new MenuItem { Header = "_Open", InputGestureText = "Ctrl+O" , Command = OpenCommand };

            MenuItem menuClosed = new MenuItem { Header = "_Closed" };
            menuClosed.Click += OnClosed;
            MenuItem menuEdit = new MenuItem { Header = "_Edit" };
            menuFile.Items.Add(menuOpen);
            menuFile.Items.Add(menuClosed);
            menu0.Items.Add(menuFile);
            menu0.Items.Add(menuEdit);

            Menu menu1 = new Menu { IsMainMenu = true };
            MenuItem menuView = new MenuItem { Header = "_View" };
            MenuItem menuLeft = new MenuItem { Header = "_Left" };
            MenuItem menuRight = new MenuItem { Header = "_Right" };
            MenuItem menuHelp = new MenuItem { Header = "_Help" };
            menuView.Items.Add(menuLeft);
            menuView.Items.Add(menuRight);
            menu1.Items.Add(menuView);
            menu1.Items.Add(menuHelp);


            StackPanel stackPanel0 = new StackPanel();
            StackPanel stackPanel1 = new StackPanel();
            stackPanel0.Children.Add(menu0);
            stackPanel1.Children.Add(menu1);
            Grid.SetRow(stackPanel1, 2);
            (this.Content as Grid).Children.Add(stackPanel0);
            (this.Content as Grid).Children.Add(stackPanel1);
        }




        private void OnOpen(object sender, ExecutedRoutedEventArgs e)
        {
            MessageBox.Show("你使用了Open命令!");
        }

        private void OnClosed(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF 中,可以使用 ed:Arc 控件来绘制圆弧进度条,并设置两端圆角。具体步骤如下: 1. 引入 ed:Arc 命名空间: ```xaml xmlns:ed="http://schemas.efxui.com/xaml" ``` 2. 在 XAML 中使用 ed:Arc 控件,并设置 StrokeStartLineCap 和 StrokeEndLineCap 属性为 Round: ```xaml <ed:Arc Stroke="Gray" StrokeThickness="10" StrokeStartLineCap="Round" StrokeEndLineCap="Round" ArcThickness="10" ArcStart="90" ArcEnd="{Binding Progress}" /> ``` 其中,StrokeStartLineCap 和 StrokeEndLineCap 属性设置线条端点的形状,ArcThickness 属性设置圆弧的宽度,ArcStart 和 ArcEnd 属性设置圆弧的起点和终点。 3. 在 ViewModel 中定义 Progress 属性,并使用 Timer 定时更新进度: ```csharp public class MainWindowViewModel : INotifyPropertyChanged { private int _progress; private Timer _timer; public int Progress { get => _progress; set { if (_progress != value) { _progress = value; OnPropertyChanged(nameof(Progress)); } } } public MainWindowViewModel() { _timer = new Timer(100); _timer.Elapsed += (sender, e) => { Progress += 5; if (Progress > 360) { Progress = 0; } }; _timer.Start(); } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` 完整代码示例: MainWindow.xaml: ```xaml <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ed="http://schemas.efxui.com/xaml" Title="MainWindow" Height="200" Width="200"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <TextBlock Text="Progress:" Margin="5" /> <ed:Arc Grid.Row="1" Stroke="Gray" StrokeThickness="10" StrokeStartLineCap="Round" StrokeEndLineCap="Round" ArcThickness="10" ArcStart="90" ArcEnd="{Binding Progress}" /> </Grid> </Window> ``` MainWindow.xaml.cs: ```csharp public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new MainWindowViewModel(); } } ``` MainWindowViewModel.cs: ```csharp public class MainWindowViewModel : INotifyPropertyChanged { private int _progress; private Timer _timer; public int Progress { get => _progress; set { if (_progress != value) { _progress = value; OnPropertyChanged(nameof(Progress)); } } } public MainWindowViewModel() { _timer = new Timer(100); _timer.Elapsed += (sender, e) => { Progress += 5; if (Progress > 360) { Progress = 0; } }; _timer.Start(); } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值