C# 在窗体对象(本机类)上按住鼠标按钮时的延迟操作

C# 在窗体对象(本机类)上按住鼠标按钮时的延迟操作,c#,.net,frameworks,C#,.net,Frameworks,最近,我使用了我正在学习的许多示例和技巧,为表单.Net创建了自己的控件类。 а 如果您试图解释该功能是什么,那么我尝试模拟ProgressBar,只是稍微修改了一下。它有各种方法来改变级别。对我来说,最有趣的一个是按住鼠标左键的能力,这样级别首先移动到鼠标的指定位置,然后我可以在继续移动鼠标的同时控制它 如果您试图简化代码,则此过程的管理如下所示: class Seasonality_ProgressBar : Control Stopwatch st = new Stopwatch();

最近,我使用了我正在学习的许多示例和技巧,为表单.Net创建了自己的控件类。 а

如果您试图解释该功能是什么,那么我尝试模拟ProgressBar,只是稍微修改了一下。它有各种方法来改变级别。对我来说,最有趣的一个是按住鼠标左键的能力,这样级别首先移动到鼠标的指定位置,然后我可以在继续移动鼠标的同时控制它

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

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";
     }
 }
可以看出,一段时间后,该方法在计时器ю上启动 然后我尝试将这个类的一个实例与我想要反映在ProgressBar上获得的值的标签一起放置在表单上。我打过这样的电话:

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();
    }
我绝对不能在按住鼠标时不移动就将值输出到标签。该值仅在释放时显示,但我不喜欢它。我也有多次渲染的标签的价值显然是不断变化

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

这里最好的方法是创建您的活动。比如说

公共委托在ValueChangedEvent值上无效; 关于价值变更的公共事件;关于价值变更的公共事件; 每次更改Value属性时都需要激发它

公共整数值 { 获取=>\u值; 设置 { 如果值>=值最小值(&V) { label2.Text=value.ToString; }; }
另外,尽量避免使用计时器和任何你可能编造的“延迟”逻辑,除非它听起来对业务逻辑来说很自然。如果你真的需要它,有一个非常适合像UI staff这样的事件驱动开发的工具

我不明白event OnValueChanged做了什么?你能展示一下吗?你好!我试过你的选项,效果很好!但是,问题是当表单上有很多实例时仍然保留,我分别有12个和12个标签。当然,我可以修复每个人的绑定…label4.Text=-seasonality\u ProgressBar2.Value.ToString;seasonality\u ProgressBar2.OnValueChanged+=SomeEvent;…但是SomeEvent方法也必须重写多次。我的问题是:如何制作一系列表格,将变化从一个单一的事件绑定到一个单独的季节性事件,而不是编写大量的事件?