WPFにて動的に生成した画像にContextMenuを付けたいです
静的で表すとこんな感じにしたいです。
WPF
1 <Image x:Name="Image1"> 2 <Image.ContextMenu> 3 <ContextMenu> 4 <MenuItem Header="A" Click="A_Click"/> 5 </ContextMenu> 6 </Image.ContextMenu> 7 </Image>
ですが
WPF
1Image img = new Image(); 2MenuItem menuItemA = new MenuItem(); 3menuItemA.Header = "A"; 4menuItemA.Click += A_Click; 5img.ContextMenu.Items.Add(menuItem1); 6Grid1.Children.Add(img);
とやると実行時に5行目でエラーがでてしまいます。
これはImg自体にContextMenuというオブジェクトが備わっていないと私は判断しました。
ですのでImageクラスに備わっていないContextMenuの取り付け方、またはその代替案が存在して入れば教えていただきたいです
プログラミング自体初心者ですが、是非ともよろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答2件
0
回答ありがとうございました。
cs
1Image img = new Image(); 2MenuItem menuItemA = new MenuItem(); 3menuItemA.Header = "A"; 4menuItemA.Click += A_Click; 5img.ContextMenu = new ContextMenu(); 6img.ContextMenu.Items.Add(menuItem1); 7Grid1.Children.Add(img);
としたところNullReferenceException
がなくなり無事作動しました。
後半部分は少し理解に時間がかかりそうなので、これから勉強しながら意味を完璧に理解できるよう頑張ります
投稿2023/03/14 11:40
総合スコア1
0
ベストアンサー
とやると実行時に5行目でエラーがでてしまいます。
NullReferenceException
ですね(エラー内容は質問に書いておいてください)
これはImg自体にContextMenuというオブジェクトが備わっていないと私は判断しました。
はい。
xamlでいうと<ContextMenu>
の部分が、C#コードにはありません。
cs
1var menuItem = new MenuItem(); 2var contextMenu = new ContextMenu(); 3contextMenu.Items.Add(menuItem); 4var image = new Image(); 5image.ContextMenu = contextMenu;
か、
cs
1var menuItem = new MenuItem(); 2var image = new Image(); 3image.ContextMenu = new ContextMenu(); 4image.ContextMenu.Items.Add(menuItem);
としてください(意味は同じ)
ContextMenu の概要 - WPF .NET Framework | Microsoft Learn
今は無理ですがオブジェクト初期化子でイベントも書けるようになれば、xamlと同じ順で記述できます(いつ来るかはわかりません)
cs
1var image = new Image { ContextMenu = new ContextMenu { Items = { new MenuItem { } } } };
xml
1<Window 2 x:Class="Q6n8cq9goqybfsp.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="450"> 7 <Canvas Background="Transparent" MouseLeftButtonUp="Canvas_MouseLeftButtonUp"> 8 <Image Source="https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/132786/KnkDDC5A_thumbnail.jpg"> 9 <Image.ContextMenu> 10 <ContextMenu> 11 <MenuItem Click="A_Click" Header="A" /> 12 </ContextMenu> 13 </Image.ContextMenu> 14 </Image> 15 </Canvas> 16</Window>
cs
1using System; 2using System.Diagnostics; 3using System.Windows; 4using System.Windows.Controls; 5using System.Windows.Input; 6using System.Windows.Media.Imaging; 7 8namespace Q6n8cq9goqybfsp; 9 10public partial class MainWindow : Window 11{ 12 public MainWindow() => InitializeComponent(); 13 14 private void A_Click(object sender, RoutedEventArgs e) => Debug.WriteLine("A_Click"); 15 16 private void Canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 17 { 18 if (sender is Canvas canvas) 19 { 20 { 21 var menuItem = new MenuItem(); 22 menuItem.Header = "A"; 23 menuItem.Click += A_Click; 24 25 var contextMenu = new ContextMenu(); 26 contextMenu.Items.Add(menuItem); 27 28 var image = new Image(); 29 image.Source = new BitmapImage(new Uri("https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/132786/KnkDDC5A_thumbnail.jpg")); 30 image.ContextMenu = contextMenu; 31 32 canvas.Children.Add(image); 33 34 35 var p = e.GetPosition(canvas); 36 Canvas.SetLeft(image, p.X); 37 Canvas.SetTop(image, p.Y); 38 } 39 40 //{ 41 // var menuItem = new MenuItem(); 42 // menuItem.Header = "A"; 43 // menuItem.Click += A_Click; 44 45 // var image = new Image(); 46 // image.Source = new BitmapImage(new Uri("https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/132786/KnkDDC5A_thumbnail.jpg")); 47 // image.ContextMenu = new ContextMenu(); 48 49 // image.ContextMenu.Items.Add(menuItem); 50 51 // canvas.Children.Add(image); 52 53 54 // var p = e.GetPosition(canvas); 55 // Canvas.SetLeft(image, p.X); 56 // Canvas.SetTop(image, p.Y); 57 //} 58 59 //{ 60 // var image = new Image 61 // { 62 // Source = new BitmapImage(new Uri("https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/132786/KnkDDC5A_thumbnail.jpg")), 63 // ContextMenu = new ContextMenu 64 // { 65 // Items = 66 // { 67 // new MenuItem 68 // { 69 // Header = "A", 70 // // こう書ければxamlと順番も揃うのだが残念ながら今は無理 71 // // [[Proposal]: Compound assignment in object initializer and `with` expression · Issue #5176 · dotnet/csharplang](https://github.com/dotnet/csharplang/issues/5176) 72 // //Click += A_Click, 73 // }, 74 // }, 75 // }, 76 // }; 77 // // 苦しすぎるw 78 // ((MenuItem)image.ContextMenu.Items[0]).Click += A_Click; 79 80 // canvas.Children.Add(image); 81 82 83 // var p = e.GetPosition(canvas); 84 // Canvas.SetLeft(image, p.X); 85 // Canvas.SetTop(image, p.Y); 86 //} 87 } 88 } 89}
投稿2023/03/14 09:05
総合スコア8870
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
同じタグがついた質問を見る
Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2023/03/14 13:06