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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WPF

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

Q&A

解決済

2回答

1246閲覧

(WPF)ー動的に生成したImageにContextMenuをつける方法

HHBMM

総合スコア1

WPF

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

1グッド

0クリップ

投稿2023/03/14 05:12

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の取り付け方、またはその代替案が存在して入れば教えていただきたいです
プログラミング自体初心者ですが、是非ともよろしくお願いいたします。

TN8001👍を押しています

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

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

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

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

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

guest

回答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

HHBMM

総合スコア1

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

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

TN8001

2023/03/14 13:06

> 後半部分は少し理解に時間がかかりそうなので、これから勉強しながら意味を完璧に理解できるよう頑張ります 今はない(いつ来るかも来るかすらも未定な)文法の話ですので、理解しないで結構です^^;
guest

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 { } } } };

[Proposal]: Compound assignment in object initializer and with expression · Issue #5176 · dotnet/csharplang

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

TN8001

総合スコア9321

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問