2017-08-01 173 views
1

我试图创建一个自定义的可滚动面板作为TableLayoutPanels滚动功能不是非常可定制的。C#事件没有触发

我有一个继承自Microsoft.Visualbasics.Powerpacks.RectangleShape的自定义类。这个类用于创建滚动条对象。它包含一个MouseDrag事件,当鼠标在滚动条上按下时应该被触发,并在鼠标恢复时终止。

此ScrollBar对象在另一个继承自Forms.Panel的自定义类中实例化。

在主窗体方法中实例化自定义面板,并将MouseDrag事件添加到ScrollBar。当我点击ScrollBar时,什么都不会发生。我甚至使用内置的Click事件进行测试,并且没有任何反应。任何帮助将非常感激。

滚动条类:

class ScrollBar : RectangleShape 
{ 
    public event MouseEventHandler MouseDrag; 
    private bool mouseHeld = false; 
    public bool MouseHeld { get => mouseHeld; set => mouseHeld = value; } 
    public ScrollBar() 
    { 
     InitializeObject(); 
    } 
    public ScrollBar(int x, int y, int width, int height) : base(x, y, width, height) 
    { 
     InitializeObject(); 
    } 
    private void InitializeObject() 
    { 
     this.MouseDown += new MouseEventHandler(mouseClickEvent); 
    } 
    public void mouseClickEvent(object sender, MouseEventArgs e) 
    { 

     MouseHeld = true; 
     MouseDrag(this, null); 

    } 
} 

定义面板类:

class CustomPanel : Panel 
{ 
    private ScrollBar verticalScrollBar; 
    public ScrollBar VerticalScrollBar { get => verticalScrollBar; set => verticalScrollBar = value; } 
    public CustomPanel() 
    { 
     PanelSetup(); 
    } 
    public CustomPanel(Size _size) 
    { 
     this.Size = _size; 
     PanelSetup(); 
    } 
    private void PanelSetup() 
    { 
     //Panel setup 
     this.BackColor = Color.White; 
     this.Location = new Point(125, 125); 
     this.BorderStyle = BorderStyle.FixedSingle; 

     //Behind scrollbar graphic 
     RectangleShape behindScrollGraphic = new RectangleShape(); 
     behindScrollGraphic.Width = 21; 
     behindScrollGraphic.Height = this.Height; 
     behindScrollGraphic.Location = new Point(this.Width - behindScrollGraphic.Width, 0); 
     behindScrollGraphic.FillStyle = FillStyle.Solid; 
     behindScrollGraphic.FillColor = SystemColors.Control; 
     behindScrollGraphic.BorderColor = Color.Transparent; 

     //adding behind scroll bar to panel 
     ShapeContainer shapeContainer = new ShapeContainer(); 
     shapeContainer.Shapes.Add(behindScrollGraphic); 
     this.Controls.Add(shapeContainer); 

    } 
    public virtual void AddVerticalScrollBar() 
    { 
     ShapeContainer rectangleShapeContainer = new ShapeContainer(); 
     rectangleShapeContainer.Shapes.Add(VerticalScrollBar); 
     this.Controls.Add(rectangleShapeContainer); 
    } 
    public virtual void CreateScrollBar(int _barWidth, int _barHeight) 
    { 
     int barWidth = _barWidth; 
     int barHeight = _barHeight; 
     VerticalScrollBar = new ScrollBar(this.Width - barWidth - 7, 5, 12, 30); 
     VerticalScrollBar.FillStyle = FillStyle.Solid; 
     VerticalScrollBar.FillColor = SystemColors.ControlDark; 
     VerticalScrollBar.BorderColor = Color.Transparent; 
    } 

} 

主窗体类:

public partial class Form1 : Form 
{ 
    private CustomPanel panel; 
    public Form1() 
    { 
     InitializeComponent(); 
     CheckForIllegalCrossThreadCalls = false; 

     //Form setup 
     this.Size = new Size(500, 500); 
     this.BackColor = Color.White; 

     //Panel setup 
     panel = new CustomPanel(new Size(250, 250)); 
     panel.CreateScrollBar(10, panel.Height - 2); 
     panel.AddVerticalScrollBar(); 

     //Scroll Bar 
     panel.VerticalScrollBar.MouseDrag += new MouseEventHandler(mouseHeldMethod); 

     //Add panel to form 
     this.Controls.Add(panel); 
    } 
    private void mouseHeldMethod(object sender, MouseEventArgs e) 
    { 
     Console.WriteLine("test"); 
     while (panel.VerticalScrollBar.MouseHeld) 
     { 
      Console.WriteLine("Held"); 
     } 
    } 

} 

回答

0

想通这个问题之前有人浪费自己的时间,控制了被另一个控制器阻挡,即使明显的另一个控制器在它后面,ev也没有错入口呼叫。