マウスを右クリックでメニューを表示しています。そのイメージを回転や画像の差し替えなど操作したいため画像の上でクリックした img の名前などを取得したいのですが取得方法がわかりません。
クリックはe.OriginalSource
に発生元が入っています。
RoutedEventArgs.OriginalSource プロパティ (System.Windows) | Microsoft Docs
コンテキストメニューはPlacementTarget
でとれるんですが、今はCanvas
についています。
ここからImage
をとるのはなかなか厳しいので、単純にImage
に(も)コンテキストメニューをつけるのが楽そうです。
ContextMenu.PlacementTarget プロパティ (System.Windows.Controls) | Microsoft Docs
xml
1<Window
2 x:Class="Questions352983.MainWindow"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 Width="800"
6 Height="600">
7 <Window.Resources>
8 <ContextMenu x:Key="Menu1">
9 <MenuItem Click="MenuItem_ImageSelect" Header="画像選択" />
10 </ContextMenu>
11 </Window.Resources>
12 <Grid>
13 <Canvas
14 Name="canvas1"
15 Background="Transparent"
16 ContextMenu="{StaticResource Menu1}"
17 MouseDown="Canvas1_MouseDown" />
18 </Grid>
19</Window>
cs
1using System;
2using System.Collections.Generic;
3using System.Diagnostics;
4using System.Windows;
5using System.Windows.Controls;
6using System.Windows.Input;
7using System.Windows.Media;
8using System.Windows.Media.Imaging;
9
10namespace Questions352983
11{
12 public partial class MainWindow : Window
13 {
14 public MainWindow()
15 {
16 InitializeComponent();
17
18 var count = 0;
19 var lineThick = 3;
20 var menu = (ContextMenu)Resources["Menu1"];
21 var items = new List<Item>
22 {
23 new Item { X = 20, Y = 20, Width = 500, Height = 300, BorderBrush = Brushes.Red, },
24 new Item { X = 60, Y = 360, Width = 190, Height = 50, BorderBrush = Brushes.Red, },
25 new Item { X = 280, Y = 340, Width = 240, Height = 200, BorderBrush = Brushes.Red, },
26 };
27 foreach (var item in items)
28 {
29 var image = new Image
30 {
31 ContextMenu = menu,
32 Name = "img" + ++count,
33 Width = item.Width,
34 Height = item.Height,
35 Source = new BitmapImage(new Uri("https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/132786/KnkDDC5A_thumbnail_32x32.jpg")),
36 };
37 // BorderのContextMenuを動かすため(Imageが上に重なってると動かないので)
38 // Borderの中にImageを入れたが本題には無関係
39 //Canvas.SetTop(image, item.Y);
40 //Canvas.SetLeft(image, item.X);
41
42 var border = new Border
43 {
44 ContextMenu = menu,
45 Background = Brushes.Transparent,
46 BorderBrush = item.BorderBrush,
47 BorderThickness = new Thickness(lineThick),
48 Width = item.Width,
49 Height = item.Height,
50 Child = image,
51 };
52 Canvas.SetTop(border, item.Y);
53 Canvas.SetLeft(border, item.X);
54
55 canvas1.Children.Add(border);
56 //canvas1.Children.Add(image);
57 }
58 }
59
60 private void MenuItem_ImageSelect(object sender, RoutedEventArgs e)
61 {
62 if (sender is MenuItem menuItem)
63 {
64 if (menuItem.Parent is ContextMenu contextMenu)
65 {
66 // 面倒だったのでMenu1を共用したが、ImageやCanvas専用メニューなら決め打ちでOK
67 if (contextMenu.PlacementTarget is Image image)
68 {
69 Debug.WriteLine($"MenuItem_ImageSelect: {image.Name}");
70 }
71 if (contextMenu.PlacementTarget is Border)
72 {
73 Debug.WriteLine($"MenuItem_ImageSelect: Border");
74 }
75 if (contextMenu.PlacementTarget is Canvas)
76 {
77 Debug.WriteLine($"MenuItem_ImageSelect: Canvas");
78 }
79 }
80 }
81 }
82
83 private void Canvas1_MouseDown(object sender, MouseButtonEventArgs e)
84 {
85 Debug.WriteLine($"Canvas1_MouseDown: {e.OriginalSource}");
86 }
87 }
88
89 class Item
90 {
91 public double X { get; set; }
92 public double Y { get; set; }
93 public double Width { get; set; }
94 public double Height { get; set; }
95 public Brush BorderBrush { get; set; }
96 }
97}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/09 23:54