2010-10-01 17 views
5

Poniższy kod jest formantem niestandardowym. Użycie tego formantu w projektancie Visual Studio powoduje, że Visual Studio staje się CRASH bez żadnych zauważalnych szczegółów.Niestandardowa kontrola powoduje, że Visual Studio 2008 to CRASH

Używam Visual Studio 2008.

Czy robię coś źle tutaj?

using System; 
using System.Text; 
using System.Windows.Forms; 
using System.Drawing; 

namespace InstalacionesSayma.GUI 
{ 
    public class CustomControlTest : Panel 
    { 
     private Label _label; 

     public CustomControlTest() 
     { 
      _label = new Label(); 
      this.Controls.Add(_label); 
     } 

     public override Font Font 
     { 
      get 
      { 
       return _label.Font; 
      } 
      set 
      { 
       _label.Font = value; 
      } 
     } 
    } 
} 
+0

Nie jestem pewien, ale usunąłbym 'this.Controls.Add (_label);' z konstruktora i umieścił go gdzie indziej - jeśli masz plik * .Design.cs, zrób tam zestaw .. . – FrustratedWithFormsDesigner

Odpowiedz

2

VS2005 miał talent do upaść na pulpicie, gdy wyjątek został podniesiony w czasie projektowania. To nie może być spowodowane przez opublikowany kod. Wątpię, żebyśmy patrzyli na prawdziwy kod, ta kontrola nic nie robi.

Należy zachować ostrożność przy konstruktorach i programach obsługi zdarzeń, również będą one miały czas projektowania. Jeśli zrobisz coś, co krytycznie zależy od stanu programu, na przykład próbujesz otworzyć pliki lub rozmawiasz z serwerem dbase itp., To unikaj uruchamiania takiego kodu, sprawdzając właściwość this.DesignMode.

5

Awaria ma miejsce z powodu zachowania czcionki. Nadpisujesz oczekiwane zachowanie właściwości czcionki panelu. Zmiana kodu czcionki do poniżej sprawia, że ​​katastrofa odejść:

public override Font Font 
    { 
    get 
    { 
     return base.Font; 
    } 
    set 
    { 
     base.Font = value; 
     _label.Font = value; 
    } 
    } 
2

Myślę, że problem jest nieruchomość czcionki w świetle charakteru, jak projektant pracuje w odniesieniu do paneli i ich zawartości. Domyślnie czcionka etykiety dziedziczy z czcionki swojego kontenera (możesz to sprawdzić, dodając panel do kontrolki, a następnie dodać etykietę do tego panelu, a następnie zmienić czcionkę panelu i altówkę, swoją etykietę - - chyba że masz explicity, biorąc pod uwagę inną niż domyślną czcionkę - zaktualizuje się nową czcionką kontenera).

W obecnej wersji, po dodaniu formantu, czcionka etykiety jest aktualizowana, aby dopasować czcionkę do kontenera i uruchomiona jest pętla bez końca.

Wygląda na to, że możesz to naprawić, nadając swojej etykiecie wyraźną czcionkę po jej utworzeniu. Coś jak to wydaje się, aby obejść ten problem:

public CustomControlTest() 
    { 
     _label = new Label(); 
     _label.Font = new Font("Ariel", 8.5f); 
     this.Controls.Add(_label); 
    } 

ETA: W odpowiedzi na Hansa, udało mi się odtworzyć awarię przy użyciu kodu podanego i VS2008, i udało mi się uniknąć katastrofy poprzez inicjowanie Czcionka .

ETA2: W mojej poprzedniej ETA zdałem sobie sprawę, że moja odpowiedź mogła brzmieć ostrzej, niż zamierzałem. Może powinienem był opracować, aby wspomnieć, że nie widziałem awarii, dopóki nie próbowałem dodać kontroli do formularza. Hans ma rację, że sam w sobie ten kod nie powinien powodować awarii programu Visual Studio ... kiedy projektant podejmuje próbę zainicjowania i narysowania kontroli, która napotka na problemy. W tej notatce, w jaki sposób można dodawać komentarze bezpośrednio do postu innej osoby? Czy potrzebna jest pewna minimalna reputacja?

Powiązane problemy