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