2016-07-13 3 views
0

Я разрабатываю приложение для форм Windows. Создание пользовательского интерфейса для некоторой службы. Что происходит, когда я создал приложение, есть несколько кнопок, на которых один клик должен работать, чтобы получить и установить значение, но после завершения кода все эти кнопки реагируют двойным щелчком. , когда мы применяем некоторую точку останова и тест, значения получают и устанавливают только одним кликом, но во время выполнения требуется двойной щелчок. Может ли кто-нибудь помочь?C#. Как избежать двойного щелчка, когда мне нужен один клик

+1

Не могли бы вы включить пример кода, который так реагирует? –

+0

Извините, но включает в себя весь код. Когда я закончил этот код, он начал реагировать двойным щелчком. Я получаю и устанавливаю значение на шине CAN. первоначально, когда мы должны получить и установить значение сигнала, и когда значение было двойного типа, все пошло правильно. Но когда тип значения изменился на тип объекта, он начал рецензировать с двойным щелчком. – AutoEng

+0

Некоторые фрагменты могут говорить больше, чем ваши слова. и это будет более понятным для нас –

ответ

0

Я получил решение, написав фрагмент кода. Просто нажмите кнопку при первом нажатии.

bool firstClick = true; {if (firstClick) {button.select(); // Активация кнопки}}

Спасибо всем за ваши ответы.

0

Полный текст Article от MSDN о том, как использовать только один клик, только дважды щелкните его. Кроме того, в нем указано, как вы можете обрабатывать события и различать один клик и двойной щелчок.

В этой статье используются булевы и таймеры. Возможно, вам понадобится использовать Dictionary<Button, boolean>, если у вас несколько кнопок. Надеюсь, поможет.

Вот пример, если связь есть или вынута для некоторого reaosn:

Обрабатывать событие MouseDown и определить местоположение и промежуток времени между щелчками, используя соответствующие свойства о системе и качестве компонента Timer. Выполните соответствующее действие в зависимости от того, имеет ли значение щелчок или двойной щелчок. Следующий пример кода демонстрирует, как это можно сделать.

class Form1 : Form 
{ 
    private Rectangle hitTestRectangle = new Rectangle(); 
    private Rectangle doubleClickRectangle = new Rectangle(); 
    private TextBox textBox1 = new TextBox(); 
    private Timer doubleClickTimer = new Timer(); 
    private ProgressBar doubleClickBar = new ProgressBar(); 
    private Label label1 = new Label(); 
    private Label label2 = new Label(); 
    private bool isFirstClick = true; 
    private bool isDoubleClick = false; 
    private int milliseconds = 0; 

    [STAThread] 
    public static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.Run(new Form1()); 
    } 

    public Form1() 
    { 
     label1.Location = new Point(30, 5); 
     label1.Size = new Size(100, 15); 
     label1.Text = "Hit test rectangle:"; 

     label2.Location = new Point(30, 70); 
     label2.Size = new Size(100, 15); 
     label2.Text = "Double click timer:"; 

     hitTestRectangle.Location = new Point(30, 20); 
     hitTestRectangle.Size = new Size(100, 40); 

     doubleClickTimer.Interval = 100; 
     doubleClickTimer.Tick += 
      new EventHandler(doubleClickTimer_Tick); 

     doubleClickBar.Location = new Point(30, 85); 
     doubleClickBar.Minimum = 0; 
     doubleClickBar.Maximum = SystemInformation.DoubleClickTime; 

     textBox1.Location = new Point(30, 120); 
     textBox1.Size = new Size(200, 100); 
     textBox1.AutoSize = false; 
     textBox1.Multiline = true; 

     this.Paint += new PaintEventHandler(Form1_Paint); 
     this.MouseDown += new MouseEventHandler(Form1_MouseDown); 
     this.Controls.AddRange(new Control[] { doubleClickBar, textBox1, 
      label1, label2 }); 
    } 

    // Detect a valid single click or double click. 
    void Form1_MouseDown(object sender, MouseEventArgs e) 
    { 
     // Verify that the mouse click is in the main hit 
     // test rectangle. 
     if (!hitTestRectangle.Contains(e.Location)) 
     { 
      return; 
     } 

     // This is the first mouse click. 
     if (isFirstClick) 
     { 
      isFirstClick = false; 

      // Determine the location and size of the double click 
      // rectangle area to draw around the cursor point. 
      doubleClickRectangle = new Rectangle(
       e.X - (SystemInformation.DoubleClickSize.Width/2), 
       e.Y - (SystemInformation.DoubleClickSize.Height/2), 
       SystemInformation.DoubleClickSize.Width, 
       SystemInformation.DoubleClickSize.Height); 
      Invalidate(); 

      // Start the double click timer. 
      doubleClickTimer.Start(); 
     } 

     // This is the second mouse click. 
     else 
     { 
      // Verify that the mouse click is within the double click 
      // rectangle and is within the system-defined double 
      // click period. 
      if (doubleClickRectangle.Contains(e.Location) && 
       milliseconds < SystemInformation.DoubleClickTime) 
      { 
       isDoubleClick = true; 
      } 
     } 
    } 

    void doubleClickTimer_Tick(object sender, EventArgs e) 
    { 
     milliseconds += 100; 
     doubleClickBar.Increment(100); 

     // The timer has reached the double click time limit. 
     if (milliseconds >= SystemInformation.DoubleClickTime) 
     { 
      doubleClickTimer.Stop(); 

      if (isDoubleClick) 
      { 
       textBox1.AppendText("Perform double click action"); 
       textBox1.AppendText(Environment.NewLine); 
      } 
      else 
      { 
       textBox1.AppendText("Perform single click action"); 
       textBox1.AppendText(Environment.NewLine); 
      } 

      // Allow the MouseDown event handler to process clicks again. 
      isFirstClick = true; 
      isDoubleClick = false; 
      milliseconds = 0; 
      doubleClickBar.Value = 0; 
     } 
    } 

    // Paint the hit test and double click rectangles. 
    void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     // Draw the border of the main hit test rectangle. 
     e.Graphics.DrawRectangle(Pens.Black, hitTestRectangle); 

     // Fill in the double click rectangle. 
     e.Graphics.FillRectangle(Brushes.Blue, doubleClickRectangle); 
    } 
} 
0

Вы можете просто определить одну кнопку и дважды с помощью таймера. Вот пример

class Form1 : Form 
{ 
     Timer timer; 

     public Form1() 
     { 
      InitializeComponent(); 
      timer = new Timer(); 
      timer.Interval = 500; 
      timer.Tick += new EventHandler(Timer_Tick); 
     } 
     private void App_MouseDown(object sender, MouseEventArgs e) 
     { 
      if (e.Clicks == 1) 
      { 
       timer.Start(); 
      } 
      else 
      { 
       timer.Stop(); 
       doubleClick(); 
      } 
     } 

     private void Timer_Tick(object sender, EventArgs e) 
     { 
      timer.Stop(); 
      singleClick(); 
     } 

     //Single click 
     public void singleClick() 
     { 
      MessageBox.Show("Single Click."); 
     } 

     //Double click 
     public void doubleClick() 
     { 
      MessageBox.Show("Double Click."); 
     } 
} 
+0

Еще одна вещь. Я не уверен, что он работает только с двойным щелчком. нравится, если мы нажмем один раз и потратим некоторое время на 2 секунды и снова нажмем, а затем и его забрать. Похоже, загрузка формы может быть проблемой. Спасибо за решение, я попробую. но по-прежнему учитывать этот комментарий. – AutoEng

Смежные вопросы