winform 中panel動態新增控制元件座標原點問題
阿新 • • 發佈:2018-12-26
問題描述
最近在寫winform程式的時候遇到一個小問題,目標效果是類似QQ的聊天對話方塊,每傳送一條訊息會在介面上顯示傳送方的頭像、傳送氣泡、以及訊息內容,如圖
按照原來的想法,每條訊息都是一個獨立的panel,然後在主介面的大的panel中add每一個panel進去,同時設定大panel的AutoScroll為true
//前面把頭像pictureBox、氣泡pictureBox、以及文字label設定好了
//新建一個小的panel
Panel p = new Panel();
p.size = new Size(100,50);
p.Controlls .Add(iconBox);
p.Controlls.Add(pictureBox);
p.Controlls.Add(messageLabel);
p.Location = new Point(0,currentHeight);
//把小的panel掛在大的panel上
this.messagesPanel.Controlls.Add(p);
this.PerformLayout();
currentHeight += p.Size.Height +10;
這裡的currentHeight是一個全域性的儲存下一個新加入panel位置的變數,每新新增一個小panel就把currentHeight增加panel的高再加10
一開始顯示正常,可是當訊息超出了panel的範圍出現滾動條後,訊息顯示不正常了,相鄰兩條訊息中間出現了空隙,如圖
經過不斷的百度,才發現原來panel的座標原點是在左上角,而且是在可視區域的左上角,也就是說當你的滾動條往下移動的時候,座標原點也會跟著移動!!所以造成了currentHeight是相對於最開始的座標原點的高度,而實際顯示的是相對於可視區域的座標原點的高度。
解決方法
兩種方法
1.設定panel的AutoScrollPosition屬性
messagesPanel.AutoScrollPosition = new Point(0,0);
//messagePanel.AutoScrollPosition = messagesPanel.VerticalScrol.Minimum;
這樣使得外面那個大的panel的滾動條回到最頂端,從而使得panel的座標原點和原來保持一致
2.設定panel.VerticalScrol.Value屬性
messagesPanel.VerticalScrol.Value = 0;
改變滾動條的值,從而改變滾動條的位置,使得滾動條回到最頂端,從而使得panel的座標原點和原來一致