C# 项目控制可单击的项目

C# 项目控制可单击的项目,c#,wpf,itemscontrol,C#,Wpf,Itemscontrol,我制作了一个应用程序,可以从视频设备流式传输视频,并添加了拍摄视频截图的功能,当拍摄一个视频时,它会显示在ItemsControl中,其余的视频都是拍摄的 我的问题是如何使ItemsControl中显示的每个项目“图像”可单击,以便预览它 我将图像详细信息存储在列表中: List<ImageDetails> images = new List<ImageDetails>(); 以下是查看捕获的代码: private void capture_Click(object

我制作了一个应用程序,可以从视频设备流式传输视频,并添加了拍摄视频截图的功能,当拍摄一个视频时,它会显示在ItemsControl中,其余的视频都是拍摄的

我的问题是如何使ItemsControl中显示的每个项目“图像”可单击,以便预览它

我将图像详细信息存储在列表中:

List<ImageDetails> images = new List<ImageDetails>();
以下是查看捕获的代码:

 private void capture_Click(object sender, RoutedEventArgs e)
    {
        // Create a Bitmap of the same dimension of panelVideoPreview (Width x Height)
        using (Bitmap bitmap = new Bitmap(viewpanel.Width, viewpanel.Height))
        {
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                // Get the paramters to call g.CopyFromScreen and get the image
                System.Drawing.Rectangle rectanglePanelVideoPreview = viewpanel.Bounds;
                System.Drawing.Point sourcePoints = viewpanel.PointToScreen(new System.Drawing.Point(viewpanel.ClientRectangle.X, viewpanel.ClientRectangle.Y));
                g.CopyFromScreen(sourcePoints, System.Drawing.Point.Empty, rectanglePanelVideoPreview.Size);
            }

            string strGrabFileName = String.Format(@"d:\app result\\Snapshot_{0:yyyyMMdd_hhmmss}.jpg", DateTime.Now);

            try
            {
                bitmap.Save(strGrabFileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                imageview(strGrabFileName);
            }
            catch (Exception)
            {


            }                
        } 
    }

 public void imageview (string file)
    {          

            ImageDetails id = new ImageDetails()
            {
                Path = file,
                FileName = System.IO.Path.GetFileName(file),
                Extension = System.IO.Path.GetExtension(file)
            };

            BitmapImage img = new BitmapImage();
            img.BeginInit();
            img.CacheOption = BitmapCacheOption.OnLoad;
            img.UriSource = new Uri(file, UriKind.Absolute);
            img.EndInit();
            id.Width = img.PixelWidth;
            id.Height = img.PixelHeight;

            // I couldn't find file size in BitmapImage
            FileInfo fi = new FileInfo(file);
            id.Size = fi.Length;
            images.Add(id);
            //images.Insert(i, id);
            ImageList.ItemsSource = null;
            ImageList.ItemsSource = images;
    }

您可以尝试各种不同的方法来实现它。检查来自

的答案您是否考虑过使用命令而不是单击事件?鉴于您使用的是WPF而不是Silverlight,以下是我为在ItemsControl中呈现的数据模板实现单击功能所做的工作:

<DataTemplate x:Key="YourDataTemplate">
        <TextBlock>
            <TextBlock.InputBindings>
                <MouseBinding 
                    MouseAction="LeftClick" 
                    Command="{Binding YourCommand}"
                    CommandParameter="{Binding YourCommandParameter}"></MouseBinding>
            </TextBlock.InputBindings>
        </TextBlock>
</DataTemplate>

这样做的第二个好处是避免了对(相对不稳定的)代码的依赖


如果您想继续使用click事件,您是否考虑过将DataTemplate中的顶级控件设置为按钮?如有必要,您可以根据需要从按钮中删除样式。按钮在DataTemplates中仍然有一个Click属性,您可以在Click-偶数中调用其DataContext,以获取用于绑定的原始ImageDetails对象。

我成功地使Click事件正常工作,现在的问题是,如果使用第一种方法,如何访问image控件以获取我单击的图像的路径,您可以从传递给click事件的CommandParameter中获取对象。你可以使用它。我没有使用链接中的任何一种方法,我在每个图像周围的边框上添加了一个mouseclickup事件,但我也想打开我刚刚单击的图像。我在DataTemplate中创建了一个按钮,但单击时什么也没有发生。
 private void capture_Click(object sender, RoutedEventArgs e)
    {
        // Create a Bitmap of the same dimension of panelVideoPreview (Width x Height)
        using (Bitmap bitmap = new Bitmap(viewpanel.Width, viewpanel.Height))
        {
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                // Get the paramters to call g.CopyFromScreen and get the image
                System.Drawing.Rectangle rectanglePanelVideoPreview = viewpanel.Bounds;
                System.Drawing.Point sourcePoints = viewpanel.PointToScreen(new System.Drawing.Point(viewpanel.ClientRectangle.X, viewpanel.ClientRectangle.Y));
                g.CopyFromScreen(sourcePoints, System.Drawing.Point.Empty, rectanglePanelVideoPreview.Size);
            }

            string strGrabFileName = String.Format(@"d:\app result\\Snapshot_{0:yyyyMMdd_hhmmss}.jpg", DateTime.Now);

            try
            {
                bitmap.Save(strGrabFileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                imageview(strGrabFileName);
            }
            catch (Exception)
            {


            }                
        } 
    }

 public void imageview (string file)
    {          

            ImageDetails id = new ImageDetails()
            {
                Path = file,
                FileName = System.IO.Path.GetFileName(file),
                Extension = System.IO.Path.GetExtension(file)
            };

            BitmapImage img = new BitmapImage();
            img.BeginInit();
            img.CacheOption = BitmapCacheOption.OnLoad;
            img.UriSource = new Uri(file, UriKind.Absolute);
            img.EndInit();
            id.Width = img.PixelWidth;
            id.Height = img.PixelHeight;

            // I couldn't find file size in BitmapImage
            FileInfo fi = new FileInfo(file);
            id.Size = fi.Length;
            images.Add(id);
            //images.Insert(i, id);
            ImageList.ItemsSource = null;
            ImageList.ItemsSource = images;
    }
<DataTemplate x:Key="YourDataTemplate">
        <TextBlock>
            <TextBlock.InputBindings>
                <MouseBinding 
                    MouseAction="LeftClick" 
                    Command="{Binding YourCommand}"
                    CommandParameter="{Binding YourCommandParameter}"></MouseBinding>
            </TextBlock.InputBindings>
        </TextBlock>
</DataTemplate>