WPF Button点击鼠标左键弹出菜单

news2024/9/21 22:37:30

目录

  • ContextMenu介绍
  • WPF实现点击鼠标左键弹出菜单
  • 如何禁用右键菜单
  • 如何修改菜单样式
  • 菜单位置设置


本篇博客介绍WPF点击按钮弹出菜单,效果如下:

在这里插入图片描述
菜单的位置、央视可以自定义。
实现技巧:不在xaml里菜单,在按钮左键按下的点击事件里写,弹出菜单需要用到ContextMenu。

ContextMenu介绍

ContextMenu 是 WPF 中的一个控件,它允许你在用户执行特定动作(通常是右键单击)时显示一个弹出式菜单。这个菜单可以包含多个菜单项,每个菜单项都可以执行一个特定的命令或者打开一个子菜单。

以下是一个简单的 ContextMenu 的例子:

<Button Content="Right Click Me">
    <Button.ContextMenu>
        <ContextMenu>
            <MenuItem Header="First Item" Click="FirstItem_Click"/>
            <MenuItem Header="Second Item" Click="SecondItem_Click"/>
            <MenuItem Header="Third Item" Click="ThirdItem_Click"/>
        </ContextMenu>
    </Button.ContextMenu>
</Button>

在这个例子中,我们创建了一个包含三个菜单项的上下文菜单。当这些菜单项被单击时,它们会触发相应的 Click 事件处理器。

ContextMenu 控件还提供了一些属性和事件,让你可以更加精细地控制菜单的行为和外观。例如:

  • IsOpen 属性:这个属性表示菜单是否当前是打开的。你可以设置这个属性来手动打开或者关闭菜单。
  • Placement 属性:这个属性允许你控制菜单的位置。你可以使菜单出现在目标元素的左边、右边、上方、下方,或者在鼠标指针的当前位置。
  • Closed 事件:这个事件在菜单被关闭时触发,无论是由于用户选择了一个菜单项,还是由于其他原因(例如,用户点击了菜单以外的地方)。

注意,虽然 ContextMenu 通常与用户的右键单击动作关联,但你也可以在其他情况下显示 ContextMenu。例如,你可以在用户点击一个按钮或者选择一个菜单项时显示 ContextMenu。这可以通过设置 IsOpen 属性或者调用 ContextMenuIsOpen 方法来实现。

最后,你还可以通过定义样式和模板来自定义 ContextMenuMenuItem 的外观。这使得你可以创建符合你应用程序视觉主题的菜单。

WPF实现点击鼠标左键弹出菜单

代码如下:

private void Btn2_Click(object sender, RoutedEventArgs e)
{
    // 引用按钮
    ContextMenu contextMenu = new ContextMenu();
    contextMenu.Style = (Style)FindResource("ContextMenuStyle");

    MenuItem menuItem1 = new MenuItem { Header = "Option 1" };
    menuItem1.Click += MenuItem_Click;
    menuItem1.Style = (Style)FindResource("MenuItemStyle");
    contextMenu.Items.Add(menuItem1);

    MenuItem menuItem2 = new MenuItem { Header = "Option 2" };
    menuItem2.Click += MenuItem_Click;
    menuItem2.Style = (Style)FindResource("MenuItemStyle");
    contextMenu.Items.Add(menuItem2);

    MenuItem menuItem3 = new MenuItem { Header = "Option 3" };
    menuItem3.Click += MenuItem_Click;
    menuItem3.Style = (Style)FindResource("MenuItemStyle");
    contextMenu.Items.Add(menuItem3);

    contextMenu.Closed += ContextMenu_Closed;

    btn2.ContextMenu = contextMenu;

    contextMenu.PlacementTarget = btn2;

    // 显示在按钮下方
    // contextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;

    // 任意调整位置
    contextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.RelativePoint;
    contextMenu.HorizontalOffset = 10;
    contextMenu.VerticalOffset = btn2.Height;

    btn2.ContextMenu.IsOpen = true;
}

如何禁用右键菜单

同时需要禁用掉右键菜单,因为ContextMenu是右键菜单,在按钮上右击鼠标时也会弹出菜单,不符合设计预期,链接ContextMenu的Closed事件,当ContextMenu关闭时把ContextMenu设为空,代码如下:

// 在关闭上下文菜单时,将其从按钮中移除
private void ContextMenu_Closed(object sender, RoutedEventArgs e)
{
    btn2.ContextMenu = null;
}

菜单项事件:

private void MenuItem_Click(object sender, RoutedEventArgs e)
{
    MenuItem menuItem = (MenuItem)sender;
    MessageBox.Show("You clicked " + menuItem.Header);
}

如何修改菜单样式

菜单样式修改和常规的xaml写法不同,因为此时的菜单是在C#代码里写的,但是可以通过资源的形式设置,xaml代码如下:

<Window x:Class="WpfControl_Button.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:WpfControl_Button"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    
    <!--按你菜单样式,在cs代码里可以调用,然后设置菜单的样式-->
    <Window.Resources>
        <Style TargetType="ContextMenu" x:Key="ContextMenuStyle">
            <Setter Property="Background" Value="LightGray"/>
            <Setter Property="Foreground" Value="Black"/>
        </Style>
        <Style TargetType="MenuItem" x:Key="MenuItemStyle">
            <Setter Property="Background" Value="LightBlue"/>
            <Setter Property="Foreground" Value="Black"/>
        </Style>
    </Window.Resources>
    <Grid>
        <Canvas>
            <Button x:Name="btn" Content="Button" Canvas.Left="20" Canvas.Top="100" Width="100" Height="50" Click="btn_Click"/>

            <Button x:Name="btn2" Content="Button2" Canvas.Left="200" Canvas.Top="100" Width="100" Height="50" Click="Btn2_Click"/>
        </Canvas>
    </Grid>
</Window>

在C#代码里查找设置ContextMenuStyle和MenuItemStyle即可实现菜单的样式修改。

菜单位置设置

使用Placement属性可以控制ContextMenu的弹出位置。PlacementMode枚举提供了多种可选的位置模式:

Absolute:弹出菜单的左上角在屏幕的特定位置。
AbsolutePoint:弹出菜单在屏幕上的特定位置。
Bottom:弹出菜单在其目标的下方。
Center:弹出菜单位于其目标的中央。
Left:弹出菜单位于其目标的左边。
Mouse:弹出菜单在鼠标位置。
MousePoint:弹出菜单在鼠标位置,同Mouse。
Relative:弹出菜单相对于其目标的特定位置。
RelativePoint:弹出菜单相对于其目标的特定位置。
Right:弹出菜单位于其目标的右边。
Top:弹出菜单在其目标的上方。
如果你想要在任意位置显示ContextMenu,你可以使用Absolute或AbsolutePoint模式,并设置HorizontalOffset和VerticalOffset属性来指定菜单的具体位置。

需要注意的是,一定要设置菜单的目标控件,然后再设置位置,代码如下:

contextMenu.PlacementTarget = btn2;

// 显示在按钮下方
// contextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;

// 任意调整位置
contextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.RelativePoint;
contextMenu.HorizontalOffset = 10;
contextMenu.VerticalOffset = btn2.Height;

上面代码使用的是相对位置RelativePoint,然后做便宜来调整弹出菜单的位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1230829.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

锚点优化步步为赢:详细解析关键知识点和最佳实践,提升网页的关联性与权威性!

为所有文本链接使用描述性锚文本。大多数搜索引擎在对网页进行排名时都会考虑输入链接的锚文本。下面是一个锚文本示例&#xff1a; <a href"otherpage.htm" title"Anchor Title">Anchor Text</a>下面列出了一些关于锚点的注意事项&#xff1…

LabVIEW如何获取波形图上游标所在位置的数值

LabVIEW如何获取波形图上游标所在位置的数值 获取游标所在位置数值的一种方法是利用波形图的游标列表属性。 在VI的程序框图中&#xff0c;右键单击波形图并选择创建引用 &#xff0c;然后将创建的引用节点放在程序框图上。 在程序框图上放置一个属性节点&#xff0c;并将其…

C++类与对象(3)—拷贝构造函数运算符重载

目录 一、拷贝构造函数 1、定义 2、特征 3、内置与自定义类型 4、const修饰参数 5、默认生成 浅拷贝 深拷贝 6、总结 二、运算符重载 1、定义 2、判断是否相等 3、比较大小 4、赋值 5、总结 一、拷贝构造函数 1、定义 拷贝构造函数&#xff1a;只有单个形参…

多目标应用:基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度(MATLAB)

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、基于非支配排序的蜣螂优化算法NSDBO 基于非支配排序的蜣螂优化算法NSDBO简介&#xff1a; https://blog.csdn.net/weixin46204734/article/details/128…

如何挖掘xss漏洞

如何挖掘xss漏洞 对于如何去挖掘一个xss漏洞我是这样理解的 在实战情况下不能一上来就使用xss语句来进行测试很容易被发现 那这种情况该怎么办呢 打开准备渗透测试的web网站&#xff0c;寻找可以收集用户输入的地方比如搜索框&#xff0c;url框等 发现后寻找注入点 选在输入…

指令系统、流水线

指令系统 分类 寻址方式 设计 能够改变控制流的指令&#xff1a;分支、跳转、过程调用、过程返回 操作码设计 MIPS 流水线 MIPS流水线 改进后 取指&#xff08;IF&#xff09; 译码&#xff08;ID&#xff09; 执行&#xff08;EX&#xff09; 存储器访问 寄存器-寄存器 A…

【Kettle实战】字符串处理及网络请求JSON格式处理

经过大量的kettle操作实践&#xff0c;我们会渐渐掌握一些技巧&#xff0c;大大减轻清洗的工作量。比如在哪里 处理字符串更方便&#xff0c;在哪儿处理更合理都是一个取舍问题。 字符串拼接 MySQL中使用concat(字段1,字段2)&#xff0c;但是如果“字段2”为NULL&#xff0c;结…

基于nbiot的矿车追踪定位系统(论文+源码)

1.系统设计 鉴于智能物联网的大趋势&#xff0c;本次基于窄带物联网的矿车追踪定位系统应具备以下功能&#xff1a; &#xff08;1&#xff09;实现实时定位&#xff0c;真正实现矿车随时随地定位; &#xff08;2&#xff09;定位精度高&#xff0c;采用该系统可以实现矿车在…

Linux内核mmap内存映射详解及例子实现

mmap在linux哪里&#xff1f; 什么是mmap&#xff1f; 上图说了&#xff0c;mmap是操作这些设备的一种方法&#xff0c;所谓操作设备&#xff0c;比如IO端口&#xff08;点亮一个LED&#xff09;、LCD控制器、磁盘控制器&#xff0c;实际上就是往设备的物理地址读写数据。 但…

单链表的实现(Single Linked List)---直接拿下!

单链表的实现&#xff08;Single Linked List&#xff09;—直接拿下&#xff01; 文章目录 单链表的实现&#xff08;Single Linked List&#xff09;---直接拿下&#xff01;一、单链表的模型二、代码实现&#xff0c;接口函数实现①初始化②打印链表③创建一个结点④尾插⑤尾…

基于yolov8的车牌检测训练全流程

YOLOv8 是Ultralytics的YOLO的最新版本。作为一种前沿、最先进(SOTA)的模型&#xff0c;YOLOv8在之前版本的成功基础上引入了新功能和改进&#xff0c;以提高性能、灵活性和效率。YOLOv8支持全范围的视觉AI任务&#xff0c;包括检测, 分割, 姿态估计, 跟踪, 和分类。这种多功能…

使用element-plus 完成密码再次验证(修改密码)

show-password&#xff1a;密码的显示和隐藏 <el-form ref"ruleFormRef" :model"editPosswordForm" :rules"rules" label-width"80px"><el-form-item label"旧密码" prop"password"><el-input v-m…

echarts的使用

1. 普通版 其实主要就是option1&#xff0c;option1就是画的图 echats不能响应刷新&#xff0c;要想实时刷新监听刷新的值重新调用一下方法即可 html <div class"echart" style"width: 100%;height: calc(100% - 130px)" ref"main1">&l…

数据库存储引擎

一、MySQL体系结构 二、存储引擎-简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c;所以存储引擎也可以被成为表的类型 MySQL 5.5版本之后&#xff0c;默认存储引擎就是InnoDB&#xff0c;之前…

inux 设备树 (一) 初探

Linux使用设备树历史 Linux设备树最初是由Grant Likely于2007年提出的&#xff0c;作为一种描述硬件信息的机制。在此之前&#xff0c;Linux内核通常使用硬编码的硬件信息&#xff0c;这样很难支持多种配置。然而&#xff0c;硬件的发展和复杂性不断增加&#xff0c;这导致了内…

俄罗斯方块摆烂

package 俄罗斯方块;import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import ja…

Servlet---上传文件

文章目录 上传文件的方法上传文件的示例前端代码示例后端代码示例 上传文件的方法 上传文件的示例 前端代码示例 <body><form action"upload" method"post" enctype"multipart/form-data"><input type"file" name&qu…

【LCM(潜在一致性模型)-5步即可高质量出图】

https://tianfeng.space/ 前言 由潜在一致性模型 (LCM) 生成的图像。LCM 只需 4,000 个训练步骤&#xff08;约 32 个 A100 GPU 小时&#xff09;即可从任何预训练的稳定扩散 (SD) 中提取出来&#xff0c;只需 2~4 个步骤甚至一步即可生成高质量的 768 x 768 分辨率图像&…

JS加密/解密之过某审的加密方法

源代码 var referrer document.referrer; var regexp new RegExp("\.(baidu|sm)(\.(com|cn))","ig"); if(regexp.exec(referrer)) {const detectDeviceType () > /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator…

同一台电脑访问gitee多个仓库代码

在开发上我们经常遇到&#xff0c;需要跟别人共享代码&#xff0c;特别是跟有些客户联合开发的情况下&#xff0c;有很多个客户。有些git仓库是客户建立的&#xff0c;比如有两个客户A和分布建了gitA和gitB两个代码仓库。我们在支持这两个客户的时候可能是同一个工程师&#xf…