Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 从关联菜单中获取所选项目_Wpf_Contextmenu_Stackpanel - Fatal编程技术网

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;初始化代码。谢谢你的帮助