2011-12-16 20 views
6

Mi configuración: Tengo una aplicación C# (.NET 3.5) en Visual Studio 2008. No hay posibilidad de cambiar a WPF o algo :).¿Habilitar un botón para hacer clic en el diseño en Visual Studio?

Mi aplicación contiene un control personalizado (una clase de botón derivada de Windows.Forms.Button) que actúa como un reemplazo para Windows.Forms.TabControl. Puedo asociar estos botones entre sí y cada botón se puede asociar con un control con el que se está tratando (generalmente, algún tipo de Windows.Forms.Panel). Se ve algo como esto:

public class TabButton : System.Windows.Forms.Button 
{ 
    // ... 
    protected override void OnClick(EventArgs e) 
    { 
     base.OnClick(e); 
     this.myAssociatedControl.Visible = true; 
     this.tellMyBuddiesToHideTheirControls(); 
    } 
    // ... 
} 

Básicamente se trata sólo de hacer clic en un botón, mostrando su control dependiente y tener los controles enlazados a los botones asociados desaparecer - al igual que el TabControl, pero el enfoque es fácilmente diseños a y yo puede colocar los botones lejos de sus paneles de contenido.

El problema: Esto funciona bastante bien en tiempo de ejecución, pero el uso en tiempo de diseño es sin duda extraña: Con el ratón, encontrar un control de eso es que pertenecen al grupo y ejecutar una serie de <Send To Back> s hasta que el el control deseado es visible.

La pregunta: ¿Hay una manera de decirle al diseñador de VS para evaluar los clics en los botones en tiempo de diseño al igual que lo hace con el TabControl para que pueda cambiar las pestañas simplemente haciendo clic en ellos como lo haría en tiempo de ejecución?

He estado buscando desde hace bastante tiempo. Hay algunos artículos aquí en SO, pero solo parecen cubrir la adición de atributos adicionales al diseñador de propiedades.

+1

este es su biblia: http://msdn.microsoft.com/en-us/library/c5z9s1h4.aspx –

+1

@DavidePiras muchas gracias por esta apuntando! Supongo que se necesitarán algunos esfuerzos para completar, pero este parece ser un buen punto de partida ... – mfeineis

+0

Encontré una solución para ver la edición ... – mfeineis

Respuesta

3

Edith dice: Por petición, una respuesta a mi propia pregunta ...

Esta es la solución que es adecuada para mi aplicación. Básicamente es un ejemplo del msdn con algunos giros para que el diseñador personalizado use una devolución de llamada al hacer clic. Espero que ayude a cualquiera :-).

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] 
public class TabButtonDesigner : System.Windows.Forms.Design.ControlDesigner 
{ 
    ShowTabGlyph myGlyph = null; 
    Adorner myAdorner; 

    public TabButtonDesigner() 
    { 
    } 

    public override void Initialize(IComponent component) 
    { 
     base.Initialize(component); 

     // Add the custom set of glyphs using the BehaviorService. 
     // Glyphs live on adornders. 
     myAdorner = new Adorner(); 
     BehaviorService.Adorners.Add(myAdorner); 
     myGlyph = new ShowTabGlyph(BehaviorService, Control); 
     myGlyph.Callback =() => 
     { 
      ((MyCustomTabButton)this.Control).ShowMyTab(); 
     }; 
     myAdorner.Glyphs.Add(myGlyph); 
    } 

    class ShowTabGlyph : Glyph 
    { 
     Control control; 
     BehaviorService behaviorSvc; 

     public Action Callback 
     { 
      get; 
      set; 
     } 

     public ShowTabGlyph(BehaviorService behaviorSvc, Control control) : 
      base(new ShowTabBehavior()) 
     { 
      this.behaviorSvc = behaviorSvc; 
      this.control = control; 
     } 

     public override Rectangle Bounds 
     { 
      get 
      { 
       // Create a glyph that is 10x10 and sitting 
       // in the middle of the control. Glyph coordinates 
       // are in adorner window coordinates, so we must map 
       // using the behavior service. 
       Point edge = behaviorSvc.ControlToAdornerWindow(control); 
       Size size = control.Size; 
       Point center = new Point(edge.X + (size.Width/2), 
        edge.Y + (size.Height/2)); 

       Rectangle bounds = new Rectangle(
        center.X - 5, 
        center.Y - 5, 
        10, 
        10); 

       return bounds; 
      } 
     } 

     public override Cursor GetHitTest(Point p) 
     { 
      // GetHitTest is called to see if the point is 
      // within this glyph. This gives us a chance to decide 
      // what cursor to show. Returning null from here means 
      // the mouse pointer is not currently inside of the glyph. 
      // Returning a valid cursor here indicates the pointer is 
      // inside the glyph, and also enables our Behavior property 
      // as the active behavior. 
      if (Bounds.Contains(p)) 
      { 
       return Cursors.Hand; 
      } 

      return null; 
     } 

     public override void Paint(PaintEventArgs pe) 
     { 
      // Draw our glyph. It is simply a blue ellipse. 
      pe.Graphics.DrawEllipse(Pens.Blue, Bounds); 
     } 

     // By providing our own behavior we can do something interesting 
     // when the user clicks or manipulates our glyph. 
     class ShowTabBehavior : Behavior 
     { 
      public override bool OnMouseUp(Glyph g, MouseButtons button) 
      { 
       //MessageBox.Show("Hey, you clicked the mouse here"); 
       //this. 
       ShowTabGlyph myG = (ShowTabGlyph)g; 
       if (myG.Callback != null) 
       { 
        myG.Callback(); 
       } 
       return true; // indicating we processed this event. 
      } 
     } 
    } 
} 

[DesignerAttribute(typeof(TabButtonDesigner))] 
public class MyCustomTabButton : System.Windows.Forms.Button 
{ 
    // The attribute will assign the custom designer to the TabButton 
    // and after a rebuild the button contains a centered blue circle 
    // that acts at design time like the button in runtime does ... 

    // ... 
} 
+0

esto no me ha funcionado. VisualStyleElement.TreeView.Glyph está sellado, y no puedo sobrescribir, también quiero hacer que se pueda hacer clic en un botón, no en un botón de tabulación – deadManN

Cuestiones relacionadas