2016-07-25 20 views
0

Guten Tag verwendet, bin ich dabei ein paar benutzerdefinierten Steuerelemente machten aus der Basis des Standard-Steuerelemente in Visual Studio, aber mehr Funktionalität für Flat-Stil Hinzufügen von Anwendungen, die ist was ich normalerweise mache. Alles läuft gut, da ich bereits einige Funktionskontrollen vorgenommen habe.VS2015 Gemeinschaft Abstürze, wenn Invalidate() in eigener Kontroll

Auf Grund meiner Visual Studio abstürzt viel zu viel Arbeit verloren haben, ich untersucht und die Frage gefunden, na ja, die Wurzel es zumindest.

Jedes Mal, wenn ich eine Variable initialisieren, die den Entwurf, geändert werden kann, sagen wir ein Boolean, die eine Grenze ein oder aus (siehe Bilder unten) dreht, ich möchte den this.Invalidate() Befehl während der Set-Ereignis der Variablen nennen. Aber jedes Mal, wenn ich die Codezeile hinzufüge und entweder auf "Lösung erstellen" oder in die Entwurfsansicht klicke, bleibt mein Visual Studio vollständig hängen und ich finde einen Windows-Fehlerberichterstattungsprozess, der im Task-Manager ausgeführt wird. Dies gibt nie einen Fehler zurück, den ich verwenden könnte.

Jedesmal, wenn ich meine Visual Studio direkt in das Projekt neu zu starten, erscheint ein Popup das sagt mir Visual Studio aufgrund eines Fehlers abgestürzt und laden nicht eine der Dateien, die ich geöffnet hatte.

Bitte beachten Sie, geschieht dies auf keinem meiner benutzerdefinierten Steuerelemente und Variablen, auch wenn ich gesetzt DrawMode = DrawMode.OwnerDrawFixed, und auch angepasst, um die alle SetStyle()

EDIT: Apologiez, Code-Beispiele:

[Category("Appearance")] 
public bool HasBorder 
{ 
    get 
    { 
     return HasBorder; 
    } 
    set 
    { 
     HasBorder = value; 
     this.Invalidate(); 
    } 
} 

public vComboBoxList() 
{ 
    Items = new List<object>(); 
    DataSource = new List<object>(); 
    SelectedItemColor = SystemColors.Highlight; 
    HoverItemColor = SystemColors.HotTrack; 
    BorderColor = SystemColors.ActiveBorder; 
    HasBorder = false; 
    ItemHeight = 16; 
    BorderThickness = 2; 
} 
protected override void OnCreateControl() 
{ 
    base.OnCreateControl(); 
} 
protected override void OnPaint(PaintEventArgs e) 
{ 
    Height = Items.Count * ItemHeight; 
    if (Items.Count > 0) 
    { 
     foreach (object Item in Items) 
     { 
      if (Items.IndexOf(Item) == ItemOver) 
       e.Graphics.FillRectangle(new SolidBrush(HoverItemColor), new Rectangle(0, Items.IndexOf(Item) * ItemHeight, Width, ItemHeight)); 
      else if (Items.IndexOf(Item) != ItemOver) 
       e.Graphics.FillRectangle(new SolidBrush(BackColor), new Rectangle(0, Items.IndexOf(Item) * ItemHeight, Width, ItemHeight)); 
      e.Graphics.DrawString(Items.IndexOf(Item).ToString(), Font, new SolidBrush(ForeColor), new Point(4, Items.IndexOf(Item) * ItemHeight)); 
     } 
    } 
    if(HasBorder && BorderThickness != 0) 
    { 
     Rectangle _Top = new Rectangle(0, 0, Width, BorderThickness); 
     Rectangle _Right = new Rectangle(Width, 0, -BorderThickness, Height); 
     Rectangle _Left = new Rectangle(0, 0, BorderThickness, Height); 
     Rectangle _Bottom = new Rectangle(0, Height, Width, -BorderThickness); 
     e.Graphics.FillRectangles(new SolidBrush(BorderColor), new Rectangle[] { _Top, _Right, _Left, _Bottom }); 
    } 
    base.OnPaint(e); 
} 

Wenn ich entfernen 'this.Invalidate()' von der 'set {}' funktioniert es perfekt.

+0

Sie haben [Entwurfszeit] zu unterscheiden (http://stackoverflow.com/q/ 1166226/1997232), es ist nicht dasselbe wie Laufzeit. Wenn Sie weitere Hilfe benötigen, ziehen Sie in Erwägung, verwandten Code zum Beitrag hinzuzufügen. Niemand wird [Code aus Bildern] kopieren (http://meta.stackoverflow.com/q/303812/1997232). – Sinatr

+0

Unterscheiden scheint die Variable auf Design oder Laufzeit zu begrenzen? Die Variable sollte zur Laufzeit und auch während des Entwurfs gesetzt werden können. Ich implementiere eine für meine Steuerelemente spezifische Theme-Engine. Obwohl dies nicht benötigt wird, wäre es schön, "Live" -Updates zu haben, um das Programm die ganze Zeit aufzubauen und zu betreiben. Oh, und ich habe die Bilder entfernt. – Hurly

Antwort

0

Diese Eigenschaft Setter hat endlose Rekursion:

[Category("Appearance")] 
public bool HasBorder 
{ 
    get 
    { 
     return HasBorder; 
    } 
    set 
    { 
     HasBorder = value; // will call setter again, which will call setter, which ... 
     this.Invalidate(); 
    } 
} 

es ändern zu normaler Voll Eigenschaft:

bool _hasBorder; 
public bool HasBorder 
{ 
    get { return _hasBorder; } 
    set 
    { 
     _hasBorder = value; 
     Invalidate(); 
    } 
} 
+0

Etwas so einfach, aber es funktioniert! :-D Danke für deine schnelle Antwort und Geduld. Ich werde ehrlich sein, es ist das erste Mal, dass ich Custom Controls mache. Nun, es ist mein erstes Mal, dass ich das tun musste. – Hurly