首页 > 其他分享 >WPF使用多个ContextMenu菜单并绑定指定控件右键事件触发菜单,以及后台获取ContextMenu的子项

WPF使用多个ContextMenu菜单并绑定指定控件右键事件触发菜单,以及后台获取ContextMenu的子项

时间:2023-11-24 09:44:43浏览次数:55  
标签:控件 菜单 ContextMenu CurveView 选中 右键 MenuItem

前端代码

<Window x:Class="EVES_ManualTest.CurveForm"
        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:wf="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
        xmlns:local="clr-namespace:EVES_ManualTest" Background="Transparent"
        mc:Ignorable="d" WindowStyle="None" ResizeMode="CanMinimize"
        Title="CurveForm" Height="450" Width="800">
    <Window.Resources>
        <!--ContextMenu圆润-->
        <Style x:Key="RoundContextMenuStyle" TargetType="{x:Type ContextMenu}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ContextMenu}">
                        <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            CornerRadius="4">
                            <StackPanel IsItemsHost="True" />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <!--#region 右键菜单-->
        <!--曲线视图右键菜单-->
        <ContextMenu x:Key="viewMenu" Style="{StaticResource RoundContextMenuStyle}" Opened="viewMenu_Opened">
            <MenuItem x:Name="vRoll" Header="坐标轴滚动" />
            <MenuItem x:Name="vScale" Header="坐标轴缩放" />
            <Separator/>
            <MenuItem x:Name="vZoomToFit" Header="缩放合适大小" />
            <MenuItem x:Name="vAutoTrack" Header="自动追踪当前数据" />
            <Separator/>
            <MenuItem x:Name="vCurveMax" Header="曲线放大" />
            <MenuItem x:Name="vCurveMin" Header="曲线缩小" />
            <MenuItem x:Name="vCurvePartMax" Header="曲线局部放大" />
            <MenuItem x:Name="vReCurve" Header="恢复" />
            <Separator/>
            <MenuItem x:Name="vShowCursor" Header="显示光标" />
            <Separator/>
            <MenuItem x:Name="vCurvePrint" Header="打印曲线" />
            <Separator/>
            <MenuItem x:Name="vCurveAttribute" Header="曲线属性" />
        </ContextMenu>
        
        <!--X轴右键菜单-->
        <ContextMenu x:Key="xMenu" Style="{StaticResource RoundContextMenuStyle}">
            <MenuItem x:Name="xRoll" Header="坐标轴滚动" />
            <MenuItem x:Name="xScale" Header="坐标轴缩放" />
            <Separator/>
            <MenuItem x:Name="xStartPoint" Header="定位起始位置" />
            <MenuItem x:Name="xZoomToFit" Header="缩放合适大小" />
            <MenuItem x:Name="xAutoTrack" Header="自动追踪当前数据" />
            <Separator/>
            <MenuItem x:Name="xEdit" Header="X轴编辑" />
        </ContextMenu>

        <!--Y轴右键菜单-->
        <ContextMenu x:Key="yMenu" Style="{StaticResource RoundContextMenuStyle}">
            <MenuItem x:Name="yRoll" Header="坐标轴滚动" />
            <MenuItem x:Name="yScale" Header="坐标轴缩放" />
            <Separator/>
            <MenuItem x:Name="yAutoTrack" Header="自动追踪当前数据" />
            <Separator/>
            <MenuItem x:Name="yEdit" Header="Y轴编辑" />
        </ContextMenu>

        <!--数据光标右键菜单-->
        <ContextMenu x:Key="cursorMenu" Style="{StaticResource RoundContextMenuStyle}">
            <MenuItem x:Name="cAllChannel" Header="全部通道" />
            <Separator/>
            <MenuItem x:Name="cTimerData" Header="时间和数据" />
            <MenuItem x:Name="cTimer" Header="时间" />
            <MenuItem x:Name="cData" Header="数据" />
            <MenuItem x:Name="cTimerDifference" Header="时间差" />
            <MenuItem x:Name="cDataDifference" Header="数据差" />
            <Separator/>
            <MenuItem x:Name="cIntervalStatistics" Header="区间统计" />
            <MenuItem x:Name="cTableIntervalStatistics" Header="区间报表" />
        </ContextMenu>
        <!--#endregion-->
    </Window.Resources>
    <Grid>
        <wf:WindowsFormsHost x:Name="CurvePanel"
                             Width="Auto" Height="Auto" Margin="0,-36,0,0" 
                             Background="Transparent">
        </wf:WindowsFormsHost>
    </Grid>
</Window>

 

后台通过指定控件事件调用(我这后台创建了一个外部控件,并为控件创建了不同区域的鼠标右键事件)

        /// <summary>
        /// 曲线视图对象
        /// </summary>
        public AxiPlotLibrary.AxiPlotX CurveView;


        private void Window_Loaded(object sender, RoutedEventArgs e)//窗口加载事件
        {
            CurveView.OnMouseDownXAxis += CurveView_OnMouseDownXAxis;
            CurveView.OnMouseDownYAxis += CurveView_OnMouseDownYAxis;
            CurveView.OnMouseDownDataView += CurveView_OnMouseDownDataView;
            CurveView.OnMouseDownDataCursor += CurveView_OnMouseDownDataCursor;
        }


        #region    右键菜单
        private void CurveView_OnMouseDownXAxis(object sender, AxiPlotLibrary.IiPlotXEvents_OnMouseDownXAxisEvent e)//右键X轴菜单
        {
            if (e.button == 2)//如果按钮为右键
            {
                ContextMenu menu = (ContextMenu)FindResource("xMenu");
                menu.PlacementTarget = (UIElement)CurvePanel;
                menu.IsOpen = true;
            }
        }

        private void CurveView_OnMouseDownYAxis(object sender, AxiPlotLibrary.IiPlotXEvents_OnMouseDownYAxisEvent e)//右键Y轴菜单
        {
            if (e.button == 2)//如果按钮为右键
            {
                if (e.button == 2)//如果按钮为右键
                {
                    ContextMenu menu = (ContextMenu)FindResource("yMenu");
                    menu.PlacementTarget = (UIElement)CurvePanel;
                    menu.IsOpen = true;
                }
            }
        }

        private void CurveView_OnMouseDownDataView(object sender, AxiPlotLibrary.IiPlotXEvents_OnMouseDownDataViewEvent e)//右键数据视图菜单
        {
            if (e.button == 2)//如果按钮为右键,显示数据视图菜单
            {
                ContextMenu menu = (ContextMenu)FindResource("viewMenu");
                menu.PlacementTarget = (UIElement)CurvePanel;
                menu.IsOpen = true;
            }
        }

        private void CurveView_OnMouseDownDataCursor(object sender, AxiPlotLibrary.IiPlotXEvents_OnMouseDownDataCursorEvent e)//右键数据光标菜单
        {
            if (e.button == 2)//如果按钮为右键
            {
                ContextMenu menu = (ContextMenu)FindResource("cursorMenu");//搜索菜单资源对象
                menu.PlacementTarget = (UIElement)CurvePanel;//绑定显示区域
                menu.IsOpen = true;//进行显示
            }
        }
        #endregion


        //以下是获取ContextMenu子项代码
        #region    右键菜单打开事件
        private void viewMenu_Opened(object sender, RoutedEventArgs e)//打开视图菜单时发生
        {
            ContextMenu viewMenu = FindResource("viewMenu") as ContextMenu;
            MenuItem vRoll = LogicalTreeHelper.FindLogicalNode(viewMenu, "vRoll") as MenuItem;//滚动状态
            MenuItem vScale = LogicalTreeHelper.FindLogicalNode(viewMenu, "vScale") as MenuItem;//缩放状态
            MenuItem vAutoTrack = LogicalTreeHelper.FindLogicalNode(viewMenu, "vAutoTrack") as MenuItem;//自动跟踪选中状态
            MenuItem vCurvePartMax = LogicalTreeHelper.FindLogicalNode(viewMenu, "vCurvePartMax") as MenuItem;//局部放大开启状态
            MenuItem vShowCursor = LogicalTreeHelper.FindLogicalNode(viewMenu, "vShowCursor") as MenuItem;//数据光标选中状态

            vRoll.IsChecked = RollJudge;//设置滚动选中状态
            vScale.IsChecked = ScaleJudge;//设置缩放选中状态
            AutoTracking = GetAllAutoTrackingEnable();//获取当前所有自动跟踪开启状态
            vAutoTrack.IsChecked = AutoTracking;//设置当前所有自动跟踪选中状态
            vCurvePartMax.IsChecked = CurveView.get_ToolBar(0).ZoomBoxActive;//获取局部放大开启状态,开启为true,关闭为false
            vShowCursor.IsChecked = CurveView.get_DataCursor(0).Visible;//设置数据光标选中状态
        }

        private void xMenu_Opened(object sender, RoutedEventArgs e)//打开X轴菜单时发生
        {
            MenuItem xRoll = (MenuItem)FindName("xRoll");//滚动状态
            MenuItem xScale = (MenuItem)FindName("xScale");//缩放状态
            MenuItem xAutoTrack = (MenuItem)FindName("xAutoTrack");//自动跟踪选中状态

            xRoll.IsChecked = RollJudge;//设置滚动选中状态
            xScale.IsChecked = ScaleJudge;//设置缩放选中状态
            AutoTracking = CurveView.get_XAxis(0).TrackingEnabled;//获取当前选中X轴自动跟踪开启状态
            xAutoTrack.IsChecked = AutoTracking;//设置当前选中X轴自动跟踪选中状态
        }

        private void yMenu_Opened(object sender, RoutedEventArgs e)//打开Y轴菜单时发生
        {
            MenuItem yRoll = (MenuItem)FindName("yRoll");//滚动状态
            MenuItem yScale = (MenuItem)FindName("yScale");//缩放状态
            MenuItem yAutoTrack = (MenuItem)FindName("yAutoTrack");//自动跟踪选中状态

            yRoll.IsChecked = RollJudge;//设置滚动选中状态
            yScale.IsChecked = ScaleJudge;//设置缩放选中状态
            AutoTracking = CurveView.get_XAxis(0).TrackingEnabled;//获取当前选中X轴自动跟踪开启状态
            yAutoTrack.IsChecked = AutoTracking;//设置当前选中X轴自动跟踪选中状态
        }

        private void cursorMenu_Opened(object sender, RoutedEventArgs e)//打开数据光标菜单时发生
        {

        }
        #endregion

 

标签:控件,菜单,ContextMenu,CurveView,选中,右键,MenuItem
From: https://www.cnblogs.com/Kirito-Asuna-Yoyi/p/17853040.html

相关文章

  • H5+ plus.barcode.Barcode 扫码控件 返回数据错误
    创建扫码控件扫描比较复杂的条形码时返回数据错误,扫到的总是一些不相干的数据,极小概率可以扫到正确的数据,代码中已经配置条码类型过滤器,filters,代码和条码如下scan=newplus.barcode.Barcode('bcid',["plus.barcode.CODE128","plus.barcode.QR"]);原......
  • (11)frxGaugePanel1简单仪表盘控件
    参考Demo文档 E:\BaiduNetdiskDownload\FastReport6VCLEnterprise安装后版本\FastReport6VCLEnterprise\Demos\IndicatorfrxGaugePanel1.Gauge.CurrentValue:=14;//当前值frxIntervalGaugePanel1.Gauge.StartValue:=20//起始值frxIntervalGaugePanel1.Gauge.......
  • .NET8:快速集成Rapid.NET三维控件
    .NET8正式版本发布了,AnyCADRapid.NET针对.NET8进行了升级和优化。本文以WPF项目为例介绍在.NET8中使用AnyCADRapid.NET三维控件。1从.NET6升级若之前使用NET6升级到.NET8,升级过程非常简单,升级到AnyCADRapid.NET最新版本后,仅需要更改以下两处:(1).csproj文件<TargetFramewor......
  • Airtest结合Poco对控件实施精准截图,学起来!
    此文章来源于项目官方公众号:“AirtestProject”版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途1.前言最近在Q群内发现有个小伙伴提出了一个很有趣的脚本需求,想要实现“通过选择器获取到了控件,然后截图这个控件范围”,根据我们的Airtest的局部截图接口以及poco......
  • QT实战 之TableWidget控件
    QT实战之TableWidget控件指定列数setColumnCount(3)指定表头setHorizontalHeaderLabels(QStringList)指定行数setRowCount(5)设置每个单元格的内容setItem(int行数,int列数,*QTableWidgetItem内容)#include "tablewidget.h"#include "ui_tablewidget.h" TableWidge......
  • QT实战 之自定义控件(QSpinBox+QSlider)
    QT实战之自定义控件(QSpinBox+QSlider)创建自定义控件(QT设计师界面类)打开ui文件,拖拽需要用到的基础控件(QSpinBox+QSlider)事件绑定(注意QSpinBox::valueChanged有重载,需要用函数指针指定信号函数)使用自定义控件(拖拽添加Widget容器控件,右键菜单--提升为,打开提升对话框,填写提升的......
  • C#在ListView中使用按钮、输入框、进度条等控件
    usingJues.CustomListItemView;usingSystem;usingSystem.Collections.Generic;usingSystem.Windows.Forms;usingstaticSystem.Windows.Forms.ListViewItem;namespaceDemo{publicpartialclassForm1:Form{privateCustomControlcustomC......
  • GUI--JFrame学习01(基本控件)
    [Java进阶]Swing两万字大总结一(超详细教程,这不得收藏一波)_swing教程_程序喵正在路上的博客-CSDN博客1.创建第一个JFrame窗体packagelearn;importjavax.swing.*;importjava.awt.*;publicclassMyFrame01extendsJFrame{publicvoidCreateJFrame(Stringtitl......
  • 不同系统添加右键菜单
    windows生成reg文件WindowsRegistryEditorVersion5.00[HKEY_CLASSES_ROOT\*\shell\gongdan]"MUIVerb"="提交工单""AppliesTo"="System.ItemName:sql"[HKEY_CLASSES_ROOT\*\shell\gongdan\command]@="/home/l/code......
  • 界面控件DevExpress WPF流程图组件,完美复制Visio UI!(一)
    DevExpressWPFDiagram(流程图)控件帮助用户完美复制MicrosoftVisioUI,并将信息丰富且组织良好的图表、流程图和组织图轻松合并到您的下一个WPF项目中。P.S:DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着......