在表单对象(本机类)上按住鼠标按钮时操作延迟



>最近,使用了很多示例和技巧(我正在学习(,我设法为.Net表单创建了自己的控件类。 完全控制代码 введите сюда код

如果您尝试解释该功能是什么,那么我尝试制作进度条的类似物,只是略有修改。它具有更改级别的各种方法。对我来说最有趣的功能之一是能够按住鼠标左键,以便级别首先移动到鼠标的指定位置,然后我能够在继续移动鼠标的同时控制它。

如果您尝试简化代码,则此过程的管理如下所示:

class Seasonality_ProgressBar : Control
Stopwatch st = new Stopwatch();
MouseButtons mb = MouseButtons.None;
public Seasonality_ProgressBar()
{
}
protected override void OnMouseDown(MouseEventArgs e)
{
// base.OnMouseDown(e);
if (!st.IsRunning)
{
mb = e.Button;
st.Start();
if (e.Button == mb)
{
x = e.X;
y = e.Y;
timer.Elapsed += OnTimedEvent;
timer.Start();
}
}
base.OnMouseDown(e);
}

private void OnTimedEvent(Object source, ElapsedEventArgs e)
{
timer.Stop();
//MessageBox.Show("Сработало");
float reultation = x - y;
if (reultation > 0)
{
Value = "A";
}
else
{
Value = "B";
}
}

可以看出,过了一会儿,该方法在计时器上启动ю 然后,我尝试将此类的实例与标签一起放在窗体上,以反映在进度条上获得的值。我打了这样的电话:

private void seasonality_ProgressBar1_MouseUp(object sender, MouseEventArgs e)
{
label2.Text = (-seasonality_ProgressBar1.Value).ToString();
}
private void seasonality_ProgressBar1_MouseMove(object sender, MouseEventArgs e)
{
label2.Text = (-seasonality_ProgressBar1.Value).ToString();
}
private void seasonality_ProgressBar1_MouseDown(object sender, MouseEventArgs e)
{
//MessageBox.Show("Привет");
label2.Text = (-seasonality_ProgressBar1.OnTimedEventValue).ToString();
int A = 0;
}
private void seasonality_ProgressBar1_Click_1(object sender, EventArgs e)
{
label2.Text = (-seasonality_ProgressBar1.Value).ToString();
}

当按住鼠标时,我绝对无法在不移动的情况下将值输出到标签。该值仅在释放时显示,但我不喜欢它。我也有标签的多次渲染(值显然在不断变化(。

请帮助理解,教导。 谢谢。

最好的方法是创建您的活动。例如

public delegate void OnValueChangedEvent(int value);
public event OnValueChangedEvent OnValueChanged;

每次更改 Value 属性时都需要触发它

public int Value
{
get => _value;
set
{
if (value >= ValueMinimum && value <= ValueMaximum)
{
_value = value;
}
Invalidate();
// Use '?' here to avoid Null reference exception in case your event is not subscribed
OnValueChanged?.Invoke(_value);
}
}

然后,您需要从主窗体、另一个控件或任何您想要的内容订阅此事件。

public Form1()
{
InitializeComponent();
seasonality_ProgressBar1.OnValueChanged += SomeEvent;
}
private void SomeEvent(int value)
{
//Use Invoke here because your event is called from another thread
Invoke(new Action(() =>
{
label2.Text = value.ToString();
}));
}

此外,尽量避免使用计时器和您可能编造的任何"延迟"逻辑,除非它对业务逻辑来说听起来很自然。如果你真的需要它,有一个完美的库用于事件驱动的开发(如UI人员(

最新更新