WPF draw triangle and add contextmenu, menuitem programmatically

 private void DrawTriangleInCanvas()
 {
     try
     {
         triangle = new Polygon()
         {
             Stroke = Brushes.Black,
             StrokeThickness = 3,
             Fill = Brushes.Red
         };
         double height = (Math.Sqrt(3) / 2) * sideLength;
         Point centerPt = new Point(cvs.ActualWidth / 2, cvs.ActualHeight / 2);
         Point topPt = new Point(centerPt.X, cvs.ActualHeight / 2 - height / 2);
         Point leftPt = new Point(centerPt.X - sideLength / 2, centerPt.Y + height / 2);
         Point rightPt = new Point(centerPt.X + sideLength / 2, centerPt.Y + height / 2);

         triangle.Points.Add(leftPt);
         triangle.Points.Add(rightPt);
         triangle.Points.Add(topPt);
         AddContextMenuWithTriangle(triangle);
         cvs.Children.Add(triangle);
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }

 private void AddContextMenuWithTriangle(Polygon triangle)
 {
     ContextMenu cxt = new ContextMenu();
     MenuItem saveMenuItem = new MenuItem();
     saveMenuItem.Header = "Save";
     saveMenuItem.Click += (s, e) =>
    {
        SaveMenuItemMethod();
    };

     MenuItem removeMenuItem = new MenuItem();
     removeMenuItem.Header = "Delete";
     removeMenuItem.Click += (s, e) =>
     {
         DeleteMenuItemMethod();
     };

     cxt.Items.Add(saveMenuItem);
     cxt.Items.Add(removeMenuItem);
     triangle.ContextMenu = cxt;
 }

 private void DeleteMenuItemMethod()
 {
     MessageBox.Show("In Delete MenuItem!");
 }

 private void SaveMenuItemMethod()
 {
     MessageBox.Show($"In Save MenuItem!");
 }

 

 

 

 

image

 

 

 

image

 

 

 

 

 

image

 

 

 

 

 

image

 

//Window.xaml
<Window x:Class="WpfApp16.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:WpfApp16"
        mc:Ignorable="d"
        WindowState="Maximized"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Canvas x:Name="cvs"
                Background="White"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Stretch"/>
    </Grid>
</Window>



//Window.xaml.cs
using System.Runtime.CompilerServices;
using System.Text;
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 WpfApp16
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        Polygon triangle = null;
        double sideLength = 100.0d;

        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += MainWindow_Loaded;
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            DrawTriangleInCanvas();
        }

        private void DrawTriangleInCanvas()
        {
            try
            {
                triangle = new Polygon()
                {
                    Stroke = Brushes.Black,
                    StrokeThickness = 3,
                    Fill = Brushes.Red
                };
                double height = (Math.Sqrt(3) / 2) * sideLength;
                Point centerPt = new Point(cvs.ActualWidth / 2, cvs.ActualHeight / 2);
                Point topPt = new Point(centerPt.X, cvs.ActualHeight / 2 - height / 2);
                Point leftPt = new Point(centerPt.X - sideLength / 2, centerPt.Y + height / 2);
                Point rightPt = new Point(centerPt.X + sideLength / 2, centerPt.Y + height / 2);

                triangle.Points.Add(leftPt);
                triangle.Points.Add(rightPt);
                triangle.Points.Add(topPt);
                AddContextMenuWithTriangle(triangle);
                cvs.Children.Add(triangle);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void AddContextMenuWithTriangle(Polygon triangle)
        {
            ContextMenu cxt = new ContextMenu();
            MenuItem saveMenuItem = new MenuItem();
            saveMenuItem.Header = "Save";
            saveMenuItem.Click += (s, e) =>
           {
               SaveMenuItemMethod();
           };

            MenuItem removeMenuItem = new MenuItem();
            removeMenuItem.Header = "Delete";
            removeMenuItem.Click += (s, e) =>
            {
                DeleteMenuItemMethod();
            };

            cxt.Items.Add(saveMenuItem);
            cxt.Items.Add(removeMenuItem);
            triangle.ContextMenu = cxt;
        }

        private void DeleteMenuItemMethod()
        {
            MessageBox.Show("In Delete MenuItem!");
        }

        private void SaveMenuItemMethod()
        {
            MessageBox.Show($"In Save MenuItem!");
        }
    }
}

 

posted @ 2025-09-27 20:45  FredGrit  阅读(4)  评论(0)    收藏  举报