Почему события мыши не вызываются моим пользовательским элементом управления? - PullRequest
0 голосов
/ 10 декабря 2010

Я хочу создать составной пользовательский элемент управления с трекбаром и другими, которые будут использоваться некоторыми клиентскими формами.Мне нужно выставить некоторые события, такие как MouseDown и MouseUp, чтобы определить начало и конец перетаскивания.Странно, но MouseDown в порядке, но не MouseUp.Код ниже демонстрирует это.Это ошибка в .NET Framework или трекбар?Если нет, то как мне сделать это вместо этого?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace MyTrackbar
{

    public partial class UserControl1 : UserControl
    {
        public delegate void StartDragHandler();
        public delegate void EndDragHandler();

        [Category("Action")]
        [Description("Fires when user starts to drag.")]
        public event StartDragHandler StartDrag;
        [Category("Action")]
        [Description("Fires when user ends to drag.")]
        public event EndDragHandler EndDrag;

        public UserControl1()
        {
            InitializeComponent();
        }

        private void trackBar1_MouseDown(object sender, MouseEventArgs e)
        {
            textBox1.BackColor = Color.Red;
            if (StartDrag != null) {
                StartDrag();
            }

        }

        private void trackBar1_MouseUp(object sender, MouseEventArgs e)
        {
            textBox1.BackColor = Color.White;
            if (EndDrag != null) {
                EndDrag();
            }
        }
    }
}



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TestMyTrackBar
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void userControl11_StartDrag()
        {
            // Work
            textBox1.BackColor = Color.Red;
        }

        private void userControl11_MouseUp(object sender, MouseEventArgs e)
        {
            // Doesn't work !!!!!!!!!!!!
            textBox1.BackColor = Color.White;
        }
    }
}

Обновление: для людей, которые хотят проверить InitializeComponent, даже если я не изменял его:

Для пользовательского контроля:

namespace MyTrackbar
{
    partial class UserControl1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.trackBar1 = new System.Windows.Forms.TrackBar();
            this.textBox1 = new System.Windows.Forms.TextBox();
            ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit();
            this.SuspendLayout();
            // 
            // trackBar1
            // 
            this.trackBar1.Location = new System.Drawing.Point(21, 17);
            this.trackBar1.Name = "trackBar1";
            this.trackBar1.Size = new System.Drawing.Size(356, 45);
            this.trackBar1.TabIndex = 0;
            this.trackBar1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.trackBar1_MouseDown);
            this.trackBar1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.trackBar1_MouseUp);
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(31, 68);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(338, 20);
            this.textBox1.TabIndex = 1;
            // 
            // UserControl1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.trackBar1);
            this.Name = "UserControl1";
            this.Size = new System.Drawing.Size(400, 150);
            ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).EndInit();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.TrackBar trackBar1;
        private System.Windows.Forms.TextBox textBox1;
    }
}

Для клиента WinForm:

namespace TestMyTrackBar
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.userControl11 = new MyTrackbar.UserControl1();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            // 
            // userControl11
            // 
            this.userControl11.Location = new System.Drawing.Point(13, 39);
            this.userControl11.Name = "userControl11";
            this.userControl11.Size = new System.Drawing.Size(400, 114);
            this.userControl11.TabIndex = 0;
            this.userControl11.StartDrag += new MyTrackbar.UserControl1.StartDragHandler(this.userControl11_StartDrag);
            this.userControl11.MouseUp += new System.Windows.Forms.MouseEventHandler(this.userControl11_MouseUp);
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(45, 160);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(336, 20);
            this.textBox1.TabIndex = 1;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(457, 231);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.userControl11);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private MyTrackbar.UserControl1 userControl11;
        private System.Windows.Forms.TextBox textBox1;
    }
}

Ответы [ 3 ]

3 голосов
/ 12 декабря 2010

Прежде чем начать, я хочу уточнить, что ответ , предоставленный Гансом Пассантом , уже объясняет в точности то же самое, что и я.Так что, если вы сочтете это полезным, вам следует подтвердить его ответ.

Однако из обмена комментариями видно, что вы не совсем понимаете, что он пытается сказать.Возможно, я смогу немного лучше объяснить это, и, возможно, вам будет легче, если вы поймете, что происходит, если вы точно поняли, что вам нужно изменить в своем коде.

Давайте начнем с оценкитекущая ситуация: текстовое поле, являющееся частью userControl11, правильно меняет цвет, когда пользователь начинает перетаскивать трекбар.Однако текстовое поле second , являющееся частью Form1, не становится белым после завершения перетаскивания трекбара.

Ваш пользовательский элемент управления уже вызывает два пользовательских события StartDrag и EndDrag, с именами, которые явно указывают текущее состояние.В Form1 вы обрабатываете событие StartDrag пользовательского элемента управления и меняете цвет второго текстового поля на красный.Но вместо обработки события EndDrag для изменения цвета на белый, вы обрабатываете событие MouseUp.Вот почему это не работает, и что ответ Ганса пытался вам сказать. Вместо этого код вашей формы должен выглядеть следующим образом:

public partial class Form1 : Form
{
   public Form1()
   {
      InitializeComponent();

      this.userControl11.EndDrag += new MyTrackbar.UserControl1.EndDragHandler(this.userControl11_EndDrag);
   }

   private void userControl11_StartDrag()
   {
      // Works
      textBox1.BackColor = Color.Red;
   }

   private void userControl11_EndDrag()
   {
      // Now also works!
      textBox1.BackColor = Color.White;
   }
}

Вы уже понимаете, что вам нужно обработать пользовательское событие StartDrag, которое вы подняли, поэтому оно кажется достаточно простымчто также необходимо обработать событие EndDrag для достижения желаемого эффекта.

Но тогда вы можете спросить: «Почему событие MouseUp работает внутрипользовательский контроль, но не работают внутри формы?!? "Я предполагаю, что это то, что вы пытаетесь утверждать, это ошибка в .NET Framework.(Подсказка: на гораздо меньше шансов, что кто-либо из нас обнаружит настоящую ошибку в Framework, чем один из нас смущен , почему мы наблюдаем поведение, которым мы являемся, илипросто упускает что-то очевидное.)

Причина в том, что внутри пользовательского элемента управления вы обрабатываете событие MouseUp, вызванное элементом управления trackbar (trackBar1). Но это событие не распространяется вверх. То, что элемент управления trackbar вызывает событие MouseUp, не означает, что пользовательский элемент управления, содержащий его, вызывает то же событие.Похоже, вы уже знаете, что касается события MouseDown, и это то же самое, что и событие MouseUp.

Нет необходимости подавать отчет об ошибке в Microsoft и не нужно, чтобы кто-торанить их чувства.

2 голосов
/ 11 декабря 2010
    private void userControl11_MouseUp(object sender, MouseEventArgs e)
    {
        // Doesn't work !!!!!!!!!!!!
        textBox1.BackColor = Color.White;
    }

Вы должны были использовать событие EndDrag, а не MouseUp.

1 голос
/ 11 декабря 2010

Непонятна реальная проблема, поскольку реализация InitializeComponent полностью отсутствует в примере.

Итак, мой ответ основан на следующих утверждениях:

  • UserControl1.trackBar1 является TrackBar , * trackBar1_MouseDown * является подписчиком UserControl1.trackBar1.MouseDown , * trackBar1_MouseUp * является подписчиком UserControl1.trackBar1.MouseUp
  • Form1.userControl11 является UserControl1 , * userControl11_StartDrag () * является подписчиком Form1.userControl11.StartDrag событие, * userControl11_MouseUp * является подписчиком Form1.userControl11.MouseUp событие

Это правильно, что "не работает".Возможно (и вы должны подтвердить это, если это так), событие Form1.userControl11.MouseUp никогда не вызывается.Infact Form1.userControl11.MouseUp и UserControl1.trackBar1.MouseUp не совпадают;Infact UserControl1 класс представляет событие EndDrag , когда его встроенный элемент управления trackBar1 вызывает событие MouseUp .

Итак,решение состоит в том, чтобы подписаться на событие UserControl1.EndDrag, а не на мышь вверх (как заявил Ханс Пассант), чтобы отразить правильное поведение (предполагаемое мной).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...