我在Windows窗体应用程序c#代码中有一个按钮,它调用一个名为capturer的创建对象。我的代码如下:
private void button1_Click(object sender, EventArgs e)
{
obj = new Capturer(dirPath + name + "_" + surname, switcher);
}
切换器的默认值(布尔变量)为false。我想使用右键单击更改此切换器的值,并将其实时传递给对象。我希望每次按下单击时都更新对象。为了检测鼠标点击事件,我有以下代码:
private void mouseClick1(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
Trace.WriteLine("Mouse clicked");
switcher = true;
}
}
如何异步传递对象中的变量?
答案 0 :(得分:1)
每次单击鼠标时创建一个新对象都无助于提高性能。 您可能希望在Form构造函数中创建一个Capturer,然后在鼠标右键单击上调用一个方法。
Capturer这个名字暗示你正试图实施一个观察者模式,但这并不完全是这里发生的事情;表单是这里的观察者,Capturer应该对您的业务逻辑负责 - 并且有一个解释其用途的名称。
(除非您的商业案例是捕获鼠标点击次数......)
答案 1 :(得分:1)
您的问题有几种解决方案。最简单的方法是在{/ 1>创建后在switcher
之外访问Capturer
。例如,你可以把它变成一个属性:
public class Capturer
{
public Capturer(string path, bool switcher)
{
Switcher = switcher;
...
}
public bool Switcher { get; set; }
...
}
在点击处理程序中设置Switcher
值:
private void mouseClick1(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
Trace.WriteLine("Mouse clicked");
obj.Switcher = true;
}
}
如果您不想在Capturer
和obj
之间共享button1_Click()
实例mouseClick1()
,您还可以将自定义类型传入{{1}构造函数而不是原始值。如果您在表单中保存对该类型的引用,则可以随时更改它,Capturer
实例将获取更改后的值。
Capturer
您的public class Switcher
{
public bool Value { get; set; }
}
构造函数将如下所示:
Capturer
在public Capturer(string path, Switcher switcher)
{
this.switcher = switcher;
...
}
内,请确保始终通过Capturer
实例访问切换台值。即始终使用Switcher
来获取它。
您可以在按钮处理程序中创建switcher.Value
实例...
Switcher
...并在点击处理程序中设置它:
private void button1_Click(object sender, EventArgs e)
{
switcher = new Switcher();
obj = new Capturer(dirPath + name + "_" + surname, switcher);
}
这样,您只需在您的处理程序之间共享private void mouseClick1(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
Trace.WriteLine("Mouse clicked");
switcher.Value = true;
}
}
实例,而不是Switcher
实例。哪种解决方案更好取决于您希望构建应用程序的方式以及哪些部分应该耦合以及哪些部分应该解耦。
第三种解决方案是使用lambda,委托或事件。