Wpf 从关联菜单中获取所选项目
我正在动态创建一组图像,并将它们放入堆栈面板中,如下所示:-Wpf 从关联菜单中获取所选项目,wpf,contextmenu,stackpanel,Wpf,Contextmenu,Stackpanel,我正在动态创建一组图像,并将它们放入堆栈面板中,如下所示:- Image image = new Image(); image.Name = "image_" + iCounter; image.Height = 100; image.Width = 100; image.Source = bitmap; image.HorizontalAlignmen
Image image = new Image();
image.Name = "image_" + iCounter;
image.Height = 100;
image.Width = 100;
image.Source = bitmap;
image.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
image.Stretch = Stretch.Fill;
image.VerticalAlignment = VerticalAlignment.Top;
//image.MouseDown += new MouseButtonEventHandler(image_MouseDown);
image.ToolTip = "Right-Click for Options";
image.ContextMenu = GetContextMenu();
Separator separator = new Separator();
separator.Name = "separator_" + iCounter;
AddImagesStackPanel.Children.Add(image);
AddImagesStackPanel.Children.Add(separator);
iCounter++;
然后在上下文菜单中,我有以下代码:-
private System.Windows.Controls.ContextMenu GetContextMenu()
{
System.Windows.Controls.MenuItem mi1;
System.Windows.Controls.MenuItem mi2;
System.Windows.Controls.ContextMenu _contextMenu = new System.Windows.Controls.ContextMenu();
mi1 = new System.Windows.Controls.MenuItem();
mi1.Header = "Show Normal Size";
mi1.Click += new RoutedEventHandler(ContextMenuItem1_Click);
mi2 = new System.Windows.Controls.MenuItem();
mi2.Header = "Remove image";
mi2.Click += new RoutedEventHandler(ContextMenuItem2_Click);
_contextMenu.Items.Add(mi1);
_contextMenu.Items.Add(mi2);
return _contextMenu;
}
private void ContextMenuItem2_Click(object sender, RoutedEventArgs e)
{
object obj = e.OriginalSource;
string imageName = ((System.Windows.Controls.Image)obj).Name;
string[] split = imageName.Split('_');
imageUploads.RemoveAt(Convert.ToInt32(split[1]));
DisplayImagesInStackPanel(imageUploads);
}
现在,我希望在用户右键单击图像时获得所选项目,我有以下代码:-
private System.Windows.Controls.ContextMenu GetContextMenu()
{
System.Windows.Controls.MenuItem mi1;
System.Windows.Controls.MenuItem mi2;
System.Windows.Controls.ContextMenu _contextMenu = new System.Windows.Controls.ContextMenu();
mi1 = new System.Windows.Controls.MenuItem();
mi1.Header = "Show Normal Size";
mi1.Click += new RoutedEventHandler(ContextMenuItem1_Click);
mi2 = new System.Windows.Controls.MenuItem();
mi2.Header = "Remove image";
mi2.Click += new RoutedEventHandler(ContextMenuItem2_Click);
_contextMenu.Items.Add(mi1);
_contextMenu.Items.Add(mi2);
return _contextMenu;
}
private void ContextMenuItem2_Click(object sender, RoutedEventArgs e)
{
object obj = e.OriginalSource;
string imageName = ((System.Windows.Controls.Image)obj).Name;
string[] split = imageName.Split('_');
imageUploads.RemoveAt(Convert.ToInt32(split[1]));
DisplayImagesInStackPanel(imageUploads);
}
但是obj不包含图像的名称,因为它是RoutedEventArgs。有什么方法可以在上下文菜单中获取所选项目吗
感谢您的帮助和时间在评论中讨论这一点后,这应该有效:
// The binding source.
private readonly ObservableCollection<BitmapImage> _imageList = new ObservableCollection<BitmapImage>();
public ObservableCollection<BitmapImage> ImageList
{
get { return _imageList; }
}
在评论中讨论了这一点后,这应该是可行的:
// The binding source.
private readonly ObservableCollection<BitmapImage> _imageList = new ObservableCollection<BitmapImage>();
public ObservableCollection<BitmapImage> ImageList
{
get { return _imageList; }
}
考虑到您使用的是WPF,我建议您不要将图像作为静态内容添加,而是将控件绑定到图像集合。您好,HB,您能告诉我将控件绑定到图像集合的确切含义吗?你的意思是将图像放在一个列表中,然后将其绑定到面板?我将使用尽可能高的级别类,即,你可以有一个图像源或URL的列表,并使用自动创建图像。如果列表发生变化,您也会希望使用ObservableCollection。是的,这是一个很好的建议,但这有助于从上下文菜单中获取实际的ID名称吗?什么ID名称?您需要它做什么?考虑到您使用的是WPF,我建议您不要将图像作为静态内容添加,而是将控件绑定到图像集合。您好,HB,您能告诉我将控件绑定到图像集合的确切含义吗?你的意思是将图像放在一个列表中,然后将其绑定到面板?我将使用尽可能高的级别类,即,你可以有一个图像源或URL的列表,并使用自动创建图像。如果列表发生变化,您也会希望使用ObservableCollection。是的,这是一个很好的建议,但这有助于从上下文菜单中获取实际的ID名称吗?什么ID名称?你需要它做什么?嗨,HB,我试过你的代码,但是图像没有绑定到ItemsControl。正在填充ImageList,但ItemsControl中没有响应。我需要绑定到它吗?或者它应该在列表填充后自动绑定?好的,开始工作了!我必须添加这个ImageList=newObservableCollection();DataContext=this;初始化代码。感谢您的帮助,我尝试了您的代码,但是图像没有绑定到ItemsControl。正在填充ImageList,但ItemsControl中没有响应。我需要绑定到它吗?或者它应该在列表填充后自动绑定?好的,开始工作了!我必须添加这个ImageList=newObservableCollection();DataContext=this;初始化代码。谢谢你的帮助