質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

2693閲覧

動的に追加したImage コントロールの名前をマウスクリックで取得したい

byori

総合スコア71

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2021/08/06 01:51

表題の通り、動的に Image コントロールの周りに Border で線を描いています。
Canvas に Image, Border を下記のコードのように追加しました。

マウスを右クリックでメニューを表示しています。そのイメージを回転や画像の差し替えなど操作したいため画像の上でクリックした img の名前などを取得したいのですが取得方法がわかりません。

Windows10 VS2019 WPF C#

xaml

1 <Window.Resources> 2 <ContextMenu x:Key="Menu1"> 3 <MenuItem Header="画像選択" Click="MenuItem_Imageselect" /> 4 <MenuItem Header="回転"/> 5 <MenuItem Header="About us"/> 6 </ContextMenu> 7 8 : 9 10 <Canvas Name="canvas1" Grid.Row="2" Grid.RowSpan="2" Grid.Column="0" Grid.ColumnSpan="2" Background="Transparent" 11 ContextMenu="{StaticResource Menu1}" MouseDown="canvas1_MouseDown" > 12 </Canvas>

C#

1item は、コントロールの座標などのデータが入っています。 2 foreach (var itm in items) 3 { 4 System.Windows.Controls.Image img = new System.Windows.Controls.Image(); 5 Canvas.SetTop(img, itm.Y); 6 Canvas.SetLeft(img, itm.X); 7 img.Width = itm.Width; 8 img.Height = itm.Height; 9 img.Name = "img" + cnt.ToString(); 10 11 Border br = new Border(); 12 //br.Background = itm.Iro; 13 br.BorderBrush = itm.Iro; 14 br.BorderThickness = new Thickness(Left = lineThick, Top = lineThick, Width = lineThick, Height = lineThick); 15 Canvas.SetTop(br, itm.Y); 16 Canvas.SetLeft(br, itm.X); 17 br.Width = itm.Width; 18 br.Height = itm.Height; 19 20 canvas1.Children.Add(img); 21 canvas1.Children.Add(br); 22 23 ++cnt; 24 } 25 26

コントロールを表示するとこのような感じで Image と Border が表示されています。枠内でクリックしたコントロールの名前を取得したい。
イメージ説明

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

マウスを右クリックでメニューを表示しています。そのイメージを回転や画像の差し替えなど操作したいため画像の上でクリックした 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/06 08:51

編集2023/07/28 15:12
TN8001

総合スコア9401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

byori

2021/08/09 23:54

TN8001 様、いつもお世話になります。 ご提示の通りにすることでコントロールの名前を取得できました。 本当にありがとうございます、また、レスが遅くなり失礼いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問