WPF —— ContextMenu右键菜单 Canvas控件详解

ContextMenu右键菜单的实例

​​​​​​​WPF中的右键菜单主要是通过ContextMenu来实现,

在控件中使用ContextMenu

直接在控件的ContextMenu属性中关联即可。

XML 复制代码
<Label Content="右键弹出内容菜单" FontSize="20" Width="200" Height="40">
    <Label.ContextMenu>
        <ContextMenu Name="c1" ItemsSource="{Binding}">
            <ContextMenu.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Path=SubMenus}">
                    <TextBlock Text="{Binding}"></TextBlock>
                </HierarchicalDataTemplate>
            </ContextMenu.ItemTemplate>
        </ContextMenu>
    </Label.ContextMenu>
</Label>

创建一个模型类

XML 复制代码
    private void Window_Loaded_1(object sender, RoutedEventArgs e)
    {
        this.c1.DataContext = CreateMenu();
    }
    // 以后有可能在menu菜单和右键菜单等相似的控件中来进行使用,所以最好封装
    public List<Menu1> CreateMenu()
    {
        List<Menu1> list = new List<Menu1>();

        // 一级菜单
        Menu1 duandian = new Menu1("断点", null);

        // 二级菜单对象
        Menu1 duandian2_1 = new Menu1("插入断点", duandian);
        Menu1 duandian2_2 = new Menu1("插入跟踪点", duandian);
        Menu1 duandian2_3 = new Menu1("插入临时断点", duandian);

        // 一级菜单
        Menu1 pianduan = new Menu1("片段", null);

        // 二级菜单
        Menu1 pianduan2_1 = new Menu1("外侧代码", pianduan);
        list.Add(duandian);
        list.Add(pianduan);


        return list;
    }
}



public class Menu1
{
    // 树形结构的模型定义的方法
    public List<Menu1> SubMenu { get; set; } // 存储下层数据的list对象
    public string Name { get; set; } // 存储标题

    // new Menu1 (军事,null)
    // new Menu1 (军事1,父级菜单对象) 当前对象添加到父级对象中
    public Menu1(string name,Menu1 m1)
    {
        Name = name;
        if(m1 != null)
        {
            List<Menu1> m2 = m1.SubMenu ?? new List<Menu1>();
            m2.Add(this);
            m1.SubMenu = m2;
        }
    }
}

Canvas控件

定义一个区域,可以是其中的子元素相对于canvas进行定位-->

<!--Canvas.Right="0" 距离canvas右边的距离是0 上下左同理

定位元素 不要设置两个相对的距离,例如设置了Canvas。Right,就不要设置Canvas.Left

XML 复制代码
    <Canvas Width="500" Height="300">
        <StackPanel Width="100" Height="100" Background="Red"></StackPanel>
        <StackPanel Width="100" Height="100" Background="Black"
                    Canvas.Right="0"
                    Canvas.Top="0"></StackPanel>
        <StackPanel Width="100" Height="100" Background="Gray" Canvas.Left="0" Canvas.Bottom="0">
            
        </StackPanel>
        <StackPanel Width="100" Height="100" Background="Pink" Canvas.Right="0" Canvas.Bottom="0">

        </StackPanel>
        <WrapPanel Width="100" Height="100" Background="Yellow" Canvas.Left="200"
                   Canvas.Top="100">
            
        </WrapPanel>
    </Canvas>
    <!--<StackPanel Width="500" Height="300" Background="Red">
        <Button Width="100"
                Height="100"
                VerticalAlignment="Top"
                HorizontalAlignment="Left"
                Margin="400,0,0,0">
            按钮
        </Button>
    </StackPanel>-->
</Grid>

效果图如下

相关推荐
稷下元歌16 小时前
七天学会plc加机器视觉之AI 接入 外设模块开发全详细操作文档(全程配套视频按文档实操)
python·sql·qt·贪心算法·r语言·wpf·时序数据库
happyprince1 天前
11-Hugging Face Transformers 分布式与并行系统深度分析
分布式·c#·wpf
加号32 天前
【WPF】 基于 Canvas 读取并渲染 DXF 文件的技术指南
c#·wpf
AC赳赳老秦2 天前
用 OpenClaw 整理团队技术分享:自动提取 PPT 内容、生成文字稿、同步到知识库
开发语言·python·自动化·powerpoint·wpf·deepseek·openclaw
闪电悠米2 天前
黑马点评-秒杀优化-03_blocking_queue_async_order
数据库·分布式·oracle·junit·wpf·lua
kingwebo'sZone2 天前
WPF 在(WrapPanel父级使用可以自动换行)每个 TextBlock 显示一行数据(竖排,垂直)
wpf
闪电悠米3 天前
黑马点评-秒杀优化-02_lua_precheck
开发语言·redis·分布式·缓存·junit·wpf·lua
FuckPatience3 天前
WPF 获取一个控件某个依赖属性的默认绑定方式
wpf
加号33 天前
【WPF】 ListView 数据绑定:从列表呈现到复杂交互的完整实践
wpf·交互
闪电悠米3 天前
黑马点评-Redisson-01_why_redisson
java·服务器·网络·数据库·缓存·wpf