come cambiare l’immagine di controllo su una casella di controllo

ha un testo, un’immagine e poi la casella di controllo,

Voglio usare un’immagine migliore per il controllo, ma non riesco a trovare un modo per cambiare le immagini selezionate e deselezionate

this.checkBox1.CheckAlign = System.Drawing.ContentAlignment.MiddleRight; this.checkBox1.Checked = true; this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked; this.checkBox1.Image = global::ClientExam.Properties.Resources.action32; this.checkBox1.Location = new System.Drawing.Point(145, 140); this.checkBox1.Name = "checkBox1"; this.checkBox1.Size = new System.Drawing.Size(273, 127); this.checkBox1.TabIndex = 0; this.checkBox1.Text = "checkBox1"; this.checkBox1.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage; this.checkBox1.UseVisualStyleBackColor = true; 

qualcuno ne conosce uno che non mi richiede di scrivere il mio controllo?

Se stai cercando come farlo in Winforms, la semplice risposta è creare una nuova class di checkbox che deriva da CheckBox, quindi sovrascrivere il metodo OnPaint .

Ecco un esempio su come creare checkbox con aspetto personalizzato sovrascrivendo il metodo OnPaint :

 public class CustomCheckBox : CheckBox { public CustomCheckBox() { this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); } protected override void OnPaint(PaintEventArgs pevent) { base.OnPaint(pevent); if (this.Checked) { pevent.Graphics.FillRectangle(new SolidBrush(Color.Blue), new Rectangle(0, 0, 16, 16)); } else { pevent.Graphics.FillRectangle(new SolidBrush(Color.Red), new Rectangle(0, 0, 16, 16)); } } } 

È molto semplice, ma ti dà l’idea di base.

Per chiunque preferisca non sovrascrivere OnPaint, esiste una soluzione alternativa:

  1. Aggiungi un controllo ImageList e riempilo con immagini per riflettere gli stati selezionati / non selezionati.
  2. Imposta la proprietà Appearance del controllo Checkbox su Button (per eliminare l’icona CheckBox standard)
  3. Imposta la sua proprietà ‘ FlatStyle su Flat (in modo che il controllo non assomigli a un pulsante).
    Nota: potresti voler controllare anche il suo gruppo di proprietà FlatAppearance . Vale a dire CheckedBackColor , MouseDownBackColor , MouseOverBackColor , vale a dire impostarli tutti Control Valore di Control .
  4. Impostare la proprietà ImageList del controllo Checkbox sul nome del controllo ImageList .
  5. Imposta le proprietà Imageindex e ImageAlign per riflettere il suo stato corrente.
  6. Ultimo e più importante è la proprietà TextImageRelation del controllo Checkbox (questo valore non consentirà la sovrapposizione di testo e immagine a meno che non lo si desideri). ImageBeforetext valore ImageBeforetext rappresenta la posizione dell’icona CheckBox comune.

Ora l’unica cosa che rimane da fare è cambiare l’immagine quando lo stato è cambiato, smth come questo:

  private void chkMyCheckBoxWithAnImage_CheckedChanged(object sender, EventArgs e) { if (chkMyCheckBoxWithAnImage.Checked) chkMyCheckBoxWithAnImage.ImageIndex = 1; else chkMyCheckBoxWithAnImage.ImageIndex = 0; } 

Ho aggirato questo modo in un modo diverso, io uso l’immagine di sfondo e centrarlo, quindi cambio l’immagine principale ogni volta che viene controllato. questo sembra che lo voglio.

C’è un problema con questo, l’immagine di sfondo se una dimensione inappropriata con sottosopra l’immagine di controllo, e quindi non sembrerebbe giusto.

la soluzione corretta è come descrive icemanind.

Uno semplice:

sovrascrive la casella di controllo OnPaint(PaintEventArgs e) come di seguito:

 Graphics g = e.Graphics; base.OnPaint(e); //// Fill the background //SetControlSizes(); // Paint the outer rounded rectangle g.SmoothingMode = SmoothingMode.AntiAlias; using (GraphicsPath outerPath = GeneralUtilities.RoundedRectangle(mLabelRect, 1, 0)) { using (LinearGradientBrush outerBrush = new LinearGradientBrush(mLabelRect, mGradientTop, mGradientBottom, LinearGradientMode.Vertical)) { g.FillPath(outerBrush, outerPath); } using (Pen outlinePen = new Pen(mGradientTop, mRectOutlineWidth)) { outlinePen.Alignment = PenAlignment.Inset; g.DrawPath(outlinePen, outerPath); } } //// Paint the gel highlight using (GraphicsPath innerPath = GeneralUtilities.RoundedRectangle(mHighlightRect, mRectCornerRadius, mHighlightRectOffset)) { using (LinearGradientBrush innerBrush = new LinearGradientBrush(mHighlightRect, Color.FromArgb(mHighlightAlphaTop, Color.White), Color.FromArgb(mHighlightAlphaBottom, Color.White), LinearGradientMode.Vertical)) { g.FillPath(innerBrush, innerPath); } } // Paint the text TextRenderer.DrawText(g, Text, Font, mLabelRect, Color.White, Color.Transparent, TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis); 

Ma se vuoi averne una buona devi usare wpf CheckBox ControlTemplate Example