如何在 Windows 窗体中使用一个按钮控制多个用户控件
本文关键字:一个 按钮 控制 控件 用户 Windows 窗体 | 更新日期: 2023-09-27 18:34:26
我有一个将动态创建用户控件的窗体,每个用户控件都有一个开始按钮和一个停止按钮。 有没有办法在表单上有一个全部开始和停止所有按钮?
我尝试使用一个布尔值,该布尔值在单击主窗体按钮时设置为 true,但是一旦创建了用户控件,它就不会检查布尔值。
下面是主窗体的代码(vdoPlayer 是用户控件):
namespace AutoPopulateVideoSaving
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DisplayImage();
}
private void DisplayImage()
{
int h = 20;
for (int i = 0; i < 6; i++)
{
int w = i % 2;
vdoPlayer np = new vdoPlayer();
np.Location = new System.Drawing.Point((33 + 408 * w), h);
np.Name = "test" + i.ToString();
np.Size = new System.Drawing.Size(408, 266);
this.Controls.Add(np);
h = h + (266 * w);
}
}
private void StartAllBut_Click(object sender, EventArgs e)
{
}
private void StopAllBut_Click(object sender, EventArgs e)
{
}
}
}
下面是用户控件的代码:
namespace AutoPopulateVideoSaving
{
public partial class vdoPlayer : UserControl
{
public vdoPlayer()
{
InitializeComponent();
VariableClass2.InitiateVariables();
JPEGStream jpegSource1 = new JPEGStream("http:// IP address /jpg/image.jpg?resolution=320x240");
jpegSource1.Login = username;
jpegSource1.Password = password;
jpegSource1.NewFrame += new NewFrameEventHandler(jpegSource1_NewFrame);
jpegSource1.VideoSourceError += new VideoSourceErrorEventHandler(jpegSource1_VideoSourceError);
Player1.VideoSource = jpegSource1;
}
void jpegSource1_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
Bitmap image = new Bitmap(eventArgs.Frame, 320, 240);
image.Save(someFile, System.Drawing.Imaging.ImageFormat.Bmp);
}
void jpegSource1_VideoSourceError(object sender, VideoSourceErrorEventArgs eventArgs)
{
//Error handler
Debug.WriteLine(eventArgs.Description);
}
private void StartBut_Click(object sender, EventArgs e)
{
Player1.VideoSource.Start();
}
private void StopBut_Click(object sender, EventArgs e)
{
Player1.VideoSource.Stop();
}
}
}
我不知道在 Form1 的按钮单击事件中放置什么来控制其余部分。 就像我之前说的,我尝试使用布尔值,但它不起作用。 这可能吗?
首先,vdoPlayer
需要公开此功能以供其他对象调用。 像这样:
public void StartVideo()
{
Player1.VideoSource.Start();
}
public void StopVideo()
{
Player1.VideoSource.Stop();
}
(一旦这些就位,该类的单击处理程序和其他功能应该使用这些方法,而不是直接调用Start()
和Stop()
VideoSource
,只是为了更干净的代码。
此外,窗体应保留其所有相关控件的列表。 像这样的东西应该可以解决问题:
public partial class Form1 : Form
{
private List<vdoPlayer> videoPlayers;
public Form1()
{
InitializeComponent();
videoPlayers = new List<vdoPlayer>();
DisplayImage();
}
// etc.
}
每当动态创建此类控件时,只需将其添加到该列表中即可。 销毁后,将其从列表中删除。 (您可以跳过显式列表并尝试动态遍历Controls
集合以动态构建列表,但这可能会变得非常丑陋。
现在,窗体的按钮只需要调用视频播放器控件上的操作:
private void StartAllBut_Click(object sender, EventArgs e)
{
foreach (var videoPlayer in videoPlayers)
videoPlayer.StartVideo();
}
private void StopAllBut_Click(object sender, EventArgs e)
{
foreach (var videoPlayer in videoPlayers)
videoPlayer.StopVideo();
}