2016-07-25 27 views
0

好日子,我正在根據Visual Studio中的標準控件製作一些自定義控件,但爲Flat-style應用程序添加了更多功能是我通常做的。一切都很順利,因爲我已經做了很多功能控制。VS2015社區在自定義控件中使用Invalidate()時崩潰

由於我的Visual Studio崩潰導致失去了太多的工作,我調查並發現了問題,至少是它的根源。

每當我初始化一個可以使用設計修改的變量(比如說打開或關閉邊框的布爾值)(參見下面的圖片)時,我想在所述變量的Set事件期間調用this.Invalidate()命令。但是,無論何時添加代碼行並單擊Build Solution或進入設計視圖,我的Visual Studio完全凍結,並且我發現Windows錯誤報告進程在任務管理器中運行,這永遠不會返回我可以使用的錯誤。

每次我將Visual Studio直接重新啓動到項目中時,會彈出一個窗口,告訴我Visual Studio由於錯誤而崩潰,並且未加載任何已打開的文件。

請注意,這發生在我的任何自定義控件和變量,即使我設置DrawMode = DrawMode.OwnerDrawFixed,並調整所有SetStyle()

編輯:Apologiez,代碼示例:

[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); 
} 

如果我刪除'set.Invalidate()'來自'set {}',它完美的工作。

+0

您有什麼區別[設計時間](http://stackoverflow.com/q/ 1166226/1997232),它與運行時不一樣。如果您需要進一步的幫助,請考慮將相關代碼添加到帖子中。沒有人會複製[圖片中的代碼](http://meta.stackoverflow.com/q/303812/1997232)。 – Sinatr

+0

區分似乎將變量限制爲設計或運行時?變量應該可以在運行時設置,也可以在設計時設置。我正在實現一個特定於我的控件的主題引擎。雖然這不是必需的,但如果將「實時」更新作爲對照來構建和運行程序,那將是非常好的。哦,我刪除了圖片。 – Hurly

回答

0

此屬性setter有無限遞歸:

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

將其更改爲正常的全屬性:

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

一些非常簡單的東西,但它的工作原理! :-D謝謝你的快速反應和耐心。老實說,這是我第一次製作自定義控件。那是我第一次需要這樣做。 – Hurly

相關問題